Ответ
Для каждого нового 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();
// Уникален для каждого запроса
}
Ключевые моменты:
- Аннотация: Используется
@Scope("request")или@RequestScope(начиная с Spring 4.3). - Проксирование (
proxyMode): Обязательно для инъекции в бины с более длительным scope (например,singleton). Прокси откладывает получение реального экземпляра до момента вызова метода. - Использование: Идеально для хранения данных, специфичных для запроса: аутентификации пользователя, параметров транзакции, временных вычислений.