Какой scope бина Spring создаётся для нового HTTP-запроса?

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

Ответ

Для каждого нового HTTP-запроса в Spring MVC создаётся отдельный экземпляр бина с областью видимости request.

Принцип работы:

  • В начале обработки каждого HTTP-запроса Spring создаёт новый экземпляр такого бина.
  • Все внедрения (@Autowired) в рамках обработки одного запроса ссылаются на один и тот же объект.
  • После завершения обработки запроса и отправки ответа бин уничтожается сборщиком мусора.

Пример объявления:

@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestScopedBean {
    private String requestId = UUID.randomUUID().toString();
    // Уникален для каждого запроса
}

Ключевые моменты:

  1. Аннотация: Используется @Scope("request") или @RequestScope (начиная с Spring 4.3).
  2. Проксирование (proxyMode): Обязательно для инъекции в бины с более длительным scope (например, singleton). Прокси откладывает получение реального экземпляра до момента вызова метода.
  3. Использование: Идеально для хранения данных, специфичных для запроса: аутентификации пользователя, параметров транзакции, временных вычислений.