Spring IoC контейнер: области применения бинов - Request, Session, Application и WebSocket
Области Request, Session, Application и WebSocket доступны только при использовании веб-реализации Spring ApplicationContext (такой как XmlWebApplicationContext). Если вы используете эти области с обычными контейнерами Spring IoC, такими как ClassPathXmlApplicationContext, генерируется исключение IllegalStateException, которое жалуется на неизвестную область действия компонента.
Начальная веб-конфигурация
Чтобы поддерживать область действия bean-компонентов на уровнеrequest, session, application, и websocket (web-scoped beans), перед определением ваших bean-компонентов требуется небольшая начальная конфигурация. (Эта начальная настройка не требуется для стандартных областей применения: singleton и prototype.)
То, как вы выполните эту начальную настройку, зависит от вашей конкретной среды сервлетов.
Если вы обращаетесь к bean-объектам области действия в Spring Web MVC, то в действительности в рамках запроса, который обрабатывается Spring DispatcherServlet, никакой специальной настройки не требуется. DispatcherServlet уже выставляет все соответствующие состояния.
Если вы используете веб-контейнер Servlet 2.5, с запросами, обрабатываемыми вне DispatcherServlet Spring (например, при использовании JSF или Struts), вам необходимо зарегистрировать org.springframework.web.context.request.RequestContextListener ServletRequestListener. Для Servlet 3.0+ это можно сделать программно с помощью интерфейса WebApplicationInitializer. В качестве альтернативы или для более старых контейнеров добавьте следующую декларацию в файл web.xml вашего веб-приложения:
<web-app>
...
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
...
</web-app>
В качестве альтернативы, если есть проблемы с настройкой прослушивателя, рассмотрите возможность использования Spring RequestContextFilter. Сопоставление фильтра зависит от конфигурации окружающего веб-приложения, поэтому вы должны изменить его соответствующим образом. Следующий листинг показывает часть фильтра веб-приложения:
<web-app>
...
<filter>
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
</web-app>
DispatcherServlet, RequestContextListener и RequestContextFilter - все делают одно и то же, а именно связывают объект HTTP-запроса с потоком, обслуживающим этот запрос. Это делает бины с областью запросов и сессий (request, session) доступными далее по цепочке вызовов.
Читайте также:
- Spring IoC контейнер: области применения бинов
- Spring IoC контейнер: области применения бинов, синглтон
- Spring IoC контейнер: области применения бинов, прототип (prototype)
Комментарии
Отправить комментарий