java - ContextLoaderListener или нет?




2 Answers

В вашем случае нет, нет оснований сохранять ContextLoaderListener и applicationContext.xml . Если ваше приложение прекрасно работает с контекстом сервлетов, то с этим все проще.

Да, общепринятая модель заключается в том, чтобы сохранить не-веб-материал в контексте webapp-уровня, но это не более чем слабая конвенция.

Единственные убедительные причины для использования контекста webapp-уровня:

  • Если у вас есть несколько DispatcherServlet которым необходимо обмениваться услугами
  • Если у вас есть устаревшие / не-весенние сервлеты, которым нужен доступ к проводным службам Spring
  • Если у вас есть фильтры сервлетов, которые подключаются к контексту уровня webapp (например, DelegatingFilterProxy Spring Security, OpenEntityManagerInViewFilter и т. Д.),

Ни одно из них не относится к вам, поэтому дополнительная сложность необоснованна.

Просто будьте осторожны при добавлении фоновых задач в контекст сервлета, таких как запланированные задачи, JMS-соединения и т. Д. Если вы забудете добавить <load-on-startup> в ваш web.xml , то эти задачи не будут запущены до первого доступ сервлета.

Стандартное весеннее веб-приложение (созданное Roo или Template Spring MVC) создает web.xml с ContextLoaderListener и DispatcherServlet . Почему они не только используют DispatcherServlet и заставляют его загружать полную конфигурацию?

Я понимаю, что ContextLoaderListener следует использовать для загрузки материала, не относящегося к сети, и DispatcherServlet используется для загрузки веб-материалов (контроллеров, ...). И этот результат в двух контекстах: родительский и дочерний контексты.

Задний план:

Я занимался этим стандартным способом в течение нескольких лет.

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Handles Spring requests -->
<servlet>
    <servlet-name>roo</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/spring/webmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

Это часто вызывало проблемы с двумя контекстами и зависимостями между ними. Раньше я всегда мог найти решение, и у меня есть сильное чувство, что это делает структуру программного обеспечения / архитектуру всегда лучше. Но теперь я столкнулся с проблемой событий обоих контекстов .

- Однако это заставляет меня переосмыслить этот два шаблона контекста, и я спрашиваю себя: зачем мне приносить себя в эту проблему, почему бы не загрузить все файлы конфигурации ContextLoaderListener с помощью одного DispatcherServlet и полностью удалить ContextLoaderListener . (Я все равно буду иметь разные файлы конфигурации, но только один контекст.)

Есть ли причина не удалять ContextLoaderListener ?




Я хочу поделиться тем, что я сделал в своем приложении Spring-MVC:

  1. На we-mvc-config.xml я добавил только классы, аннотированные с помощью @Controller:

    <context:component-scan base-package="com.shunra.vcat">
        <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
    </context:component-scan>
    
  2. В файлах applicationContext.xml я добавил все остальное:

    <context:component-scan base-package="com.shunra.vcat">
        <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
    </context:component-scan>
    



Related