Ответ
Нет. Как и все Spring-бины, класс, аннотированный @RestController, по умолчанию имеет область видимости Singleton. Это означает, что в контексте приложения существует только один экземпляр этого контроллера, который обслуживает все входящие запросы.
Почему это важно:
- Эффективность: Singleton экономит память и время на создание объектов.
- Безопасность: Контроллеры обычно не должны хранить состояние запроса (state). Состояние должно передаваться через параметры методов, сессии или отдельные сервисы с соответствующей областью видимости (например,
@RequestScope).
Как сделать Prototype? Если по какой-то особой причине требуется новый экземпляр на запрос, можно явно указать область видимости prototype:
@RestController
@Scope("prototype")
public class MyController {
// Теперь для каждого запроса будет создан новый экземпляр
}
Однако такая необходимость возникает крайне редко и часто указывает на проблему с дизайном.
Ответ 18+ 🔞
А, слушай, смотри, тут такой прикол. Все эти твои @RestController — они по дефолту Singleton, блядь. Один на весь контекст, как царь в городе, и все запросы к нему в очередь выстраиваются, понимаешь?
А почему так, спросишь? Да потому что, ёпта, эффективно, нахуй! Не нужно каждый раз новый объект городить, память жрать и время тратить. Контроллер — он как хороший официант, у него состояния своего нет, он просто берёт заказ (запрос) и тащит его на кухню (в сервис). Всё чисто, без подлянки.
Но если уж совсем приперло, если тебе вдруг взбрендило, чтобы на каждый чих новый экземпляр плодился — ну, пожалуйста, извращайся. Нацепи ему prototype:
@RestController
@Scope("prototype")
public class MyController {
// Теперь для каждого запроса будет создан новый экземпляр
}
Только честно — если ты это делаешь, у тебя где-то в архитектуре косяк, блядь. Это как молотком гвозди забивать — нормально, а вот пытаться им шурупы крутить — уже пиздец и кривые руки. В 99.9% случаев singleton — то, что надо. Не выёбывайся.