Создаёт ли @RestController новый экземпляр (Prototype) при каждом HTTP-запросе?

Ответ

Нет. Как и все 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 — то, что надо. Не выёбывайся.