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

«Создаёт ли @RestController новый экземпляр (Prototype) при каждом HTTP-запросе?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет. Как и все Spring-бины, класс, аннотированный @RestController, по умолчанию имеет область видимости Singleton. Это означает, что в контексте приложения существует только один экземпляр этого контроллера, который обслуживает все входящие запросы.

Почему это важно:

  • Эффективность: Singleton экономит память и время на создание объектов.
  • Безопасность: Контроллеры обычно не должны хранить состояние запроса (state). Состояние должно передаваться через параметры методов, сессии или отдельные сервисы с соответствующей областью видимости (например, @RequestScope).

Как сделать Prototype? Если по какой-то особой причине требуется новый экземпляр на запрос, можно явно указать область видимости prototype:

@RestController
@Scope("prototype")
public class MyController {
    // Теперь для каждого запроса будет создан новый экземпляр
}

Однако такая необходимость возникает крайне редко и часто указывает на проблему с дизайном.