Что такое scope request у бина в Spring?

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

Ответ

Request scope в Spring означает, что контейнер создаёт отдельный экземпляр бина для каждого HTTP-запроса и уничтожает его после завершения обработки этого запроса. Это идеально для хранения состояния, специфичного для одного запроса (например, аутентификационные данные пользователя, параметры формы).

Объявление через аннотации:

@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserRequestData {
    // Состояние, уникальное для запроса
}

Или для метода @Bean в конфигурации:

@Bean
@RequestScope
public UserData userData() {
    return new UserData();
}

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

  • Область применения: Работает только в веб-приложениях (Spring MVC, Spring WebFlux).
  • Настройка: Для поддержки вне MVC (например, в сервлет-листенере) требуется регистрация RequestContextListener в web.xml.
  • Проксирование: Часто требуется режим прокси (proxyMode), чтобы инжектировать бин request scope в singleton-бины (создаётся прокси, который в runtime резолвится в актуальный бин запроса).
  • Альтернативы: Для более сложных сценариев можно использовать ThreadLocal, но request scope управляется контейнером и безопаснее.