ContextLoaderListener czy nie?

Standardowa aplikacja webowa spring (stworzona przez Roo lub szablon "Spring MVC Project") tworzy sieć.xml z ContextLoaderListener i DispatcherServlet. Dlaczego nie używają tylko DispatcherServlet i sprawiają, że ładuje się pełną konfigurację?

Rozumiem, że ContextLoaderListener powinien być użyty do załadowania rzeczy, które nie są web relevant, a DispatcherServlet jest używany do załadowania Web relevant stuff (Controllers,...). A to skutkuje dwoma kontekstami: rodzicem i dzieckiem kontekst.

Background:

Robiłam to w ten standardowy sposób przez kilka lat.
<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>
To często powodowało problemy z dwoma kontekstami i zależnościami między nimi. W przeszłości zawsze byłem w stanie znaleźć rozwiązanie i mam silne przeczucie, że to sprawia, że struktura/Architektura oprogramowania jest zawsze lepsza. Ale teraz staję przed problemem z wydarzeniami obu kontekstów.

-- jednak to sprawia, że moje przemyślenie tych dwóch wzorców kontekstowych, i zadaję sobie pytanie: dlaczego miałbym się w to wpakować, dlaczego nie załadować wszystkich plików konfiguracyjnych sprężyny jednym DispatcherServlet i całkowicie usunąć ContextLoaderListener. (Nadal będę miał różne pliki konfiguracyjne, ale tylko jeden kontekst.)

Czy jest jakiś powód, aby nie usuwać ContextLoaderListener?

Author: Community, 2012-01-26

3 answers

W Twoim przypadku, nie, nie ma powodu, aby zatrzymać ContextLoaderListener i applicationContext.xml. Jeśli Twoja aplikacja działa dobrze tylko z kontekstem serwleta, to trzymaj się tego, to jest prostsze.

Tak, ogólnie zachęcany wzorzec jest utrzymanie nie - Web rzeczy w kontekście poziomu webapp, ale to nic więcej niż słaba konwencja.

Jedyne przekonujące powody, aby korzystać z kontekstu na poziomie webapp są:

  • Jeśli masz wiele DispatcherServlet, które muszą udostępniać usługi
  • Jeśli masz starsze / serwlety bez sprężyny, które wymagają dostępu do usług przewodowych ze sprężyną]}
  • Jeśli masz filtry serwletów, które łączą się z kontekstem na poziomie webapp (np. DelegatingFilterProxy, OpenEntityManagerInViewFilter, etc)
Żadne z nich nie dotyczy ciebie, więc dodatkowa złożoność jest nieuzasadniona.

Po prostu bądź ostrożny przy dodawaniu zadań w tle do kontekstu serwletu, takich jak zaplanowane zadania, połączenia JMS itp. Jeśli zapomnisz dodać <load-on-startup> do swojego web.xml, zadania te zostaną uruchomione dopiero po pierwszym dostęp do serwletu.

 83
Author: skaffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 14:31:13

Możesz również skonfigurować kontekst aplikacji na odwrót. Np. w celu uruchomienia OpenEntityManagerInViewFilter . Skonfiguruj ContextLoaderListener, a następnie skonfiguruj DispatcherServlet za pomocą:

<servlet>
    <servlet-name>spring-mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value></param-value>
    </init-param>
</servlet>

Upewnij się, że wartość parametru contextConfigLocation jest pusta.

 10
Author: Gunnar Hillert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-27 21:12:30

Chcę podzielić się tym, co zrobiłem na mojej aplikacji Spring-MVC:

  1. Na we-mvc-config.xml dodałem tylko klasy z adnotacją @ Controller:

    <context:component-scan base-package="com.shunra.vcat">
        <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
    </context:component-scan>
    
  2. Na plikach applicationContext.xml dodałem całą resztę:

    <context:component-scan base-package="com.shunra.vcat">
        <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
    </context:component-scan>
    
 10
Author: Modi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-01 22:28:47