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
?
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)
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.
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.
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:
-
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>
-
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>
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