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) доступными далее по цепочке вызовов.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки