Как создать бин с областью видимости Request в Spring?

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

Ответ

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

Способы объявления:

  1. Аннотация @RequestScope (рекомендуется):

    import org.springframework.web.context.annotation.RequestScope;
    
    @Component
    @RequestScope // Жизненный цикл привязан к HTTP-запросу
    public class RequestScopedBean {
        private String requestId;
        // Геттеры и сеттеры...
    }
  2. Аннотация @Scope("request"):

    import org.springframework.context.annotation.Scope;
    import org.springframework.web.context.WebApplicationContext;
    
    @Component
    @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public class AnotherRequestBean {
        // ...
    }
  3. В конфигурации Java Config:

    @Configuration
    public class AppConfig {
        @Bean
        @RequestScope
        public MyRequestData myRequestData() {
            return new MyRequestData();
        }
    }

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

  • Требуется веб-контекст: Работает только в Spring MVC или другом веб-приложении.
  • Проксирование: Spring по умолчанию создает CGLIB-прокси для бина, чтобы инжектировать актуальный экземпляр для каждого запроса.
  • Ошибка вне запроса: Попытка доступа к такому бину вне контекста HTTP-запроса (например, в фоновой задаче) вызовет IllegalStateException.
  • Использование: Часто применяется для хранения аутентифицированного пользователя (@AuthenticationPrincipal), параметров запроса или состояния многошаговой формы.