Ответ
Да, в Spring можно. Бин с областью видимости (scope) request создается один раз на каждый HTTP-запрос и уничтожается после его завершения. Это идеально для хранения данных, специфичных для одного запроса (например, атрибуты пользователя, данные формы).
Способы объявления:
-
Аннотация
@RequestScope(рекомендуется):import org.springframework.web.context.annotation.RequestScope; @Component @RequestScope // Жизненный цикл привязан к HTTP-запросу public class RequestScopedBean { private String requestId; // Геттеры и сеттеры... } -
Аннотация
@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 { // ... } -
В конфигурации Java Config:
@Configuration public class AppConfig { @Bean @RequestScope public MyRequestData myRequestData() { return new MyRequestData(); } }
Ключевые моменты:
- Требуется веб-контекст: Работает только в Spring MVC или другом веб-приложении.
- Проксирование: Spring по умолчанию создает CGLIB-прокси для бина, чтобы инжектировать актуальный экземпляр для каждого запроса.
- Ошибка вне запроса: Попытка доступа к такому бину вне контекста HTTP-запроса (например, в фоновой задаче) вызовет
IllegalStateException. - Использование: Часто применяется для хранения аутентифицированного пользователя (
@AuthenticationPrincipal), параметров запроса или состояния многошаговой формы.