Standardowa aplikacja internetowa Spring (stworzona przez Roo lub szablon „Spring MVC Project”) tworzy plik web.xml z użyciem ContextLoaderListener
i DispatcherServlet
. Dlaczego nie tylko używają DispatcherServlet
i sprawiają, że ładują całą konfigurację?
Rozumiem, że ContextLoaderListener powinien być używany do ładowania rzeczy, które nie są istotne dla sieci, a DispatcherServlet służy do ładowania odpowiednich rzeczy internetowych (kontrolerów, ...). W rezultacie powstają dwa konteksty: kontekst rodzica i kontekst dziecka.
Tło:
Robiłem 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>
Często powodowało to 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 dzięki temu struktura / architektura oprogramowania jest zawsze lepsza. Ale teraz mam problem z wydarzeniami z obu kontekstów .
- Jednak to zmusza mnie do ponownego przemyślenia tych dwóch wzorców kontekstowych i zadaję sobie pytanie: dlaczego miałbym się w to pakować, dlaczego nie załadować wszystkich plików konfiguracyjnych sprężyny jednym DispatcherServlet
i ContextLoaderListener
całkowicie usunąć . (Nadal będę mieć różne pliki konfiguracyjne, ale tylko jeden kontekst).
Czy jest jakiś powód, aby nie usuwać ContextLoaderListener
?
Odpowiedzi:
W twoim przypadku nie, nie ma powodu, aby zachować
ContextLoaderListener
iapplicationContext.xml
. Jeśli twoja aplikacja działa dobrze tylko z kontekstem serwletu, to się przy tym trzyma, jest prostsze.Tak, ogólnie zalecanym wzorcem jest trzymanie rzeczy spoza sieci w kontekście poziomu aplikacji internetowej, ale to nic innego jak słaba konwencja.
Jedyne istotne powody, dla których warto używać kontekstu na poziomie aplikacji internetowej, to:
DispatcherServlet
które muszą udostępniać usługiDelegatingFilterProxy
,OpenEntityManagerInViewFilter
itp)Żadne z nich nie dotyczy Ciebie, więc dodatkowa złożoność jest nieuzasadniona.
Po prostu zachowaj ostrożność podczas dodawania zadań w tle do kontekstu serwletu, takich jak zaplanowane zadania, połączenia JMS, itp. Jeśli zapomnisz dodać coś
<load-on-startup>
do swojegoweb.xml
, zadania te nie zostaną uruchomione do pierwszego dostępu do serwletu.źródło
DispatcherServlet
bez konfiguracji - gdybyś to zrobił, nie miałbyś interfejsu internetowego. Wszystkie rzeczy z MVC muszą tam trafić.Możesz również skonfigurować kontekst aplikacji na odwrót. Np. Aby OpenEntityManagerInViewFilter działał. Skonfiguruj ContextLoaderListener, a następnie skonfiguruj DispatcherServlet za pomocą:
Po prostu upewnij się, że wartość parametru contextConfigLocation jest pusta.
źródło
Chcę podzielić się tym, co zrobiłem w mojej aplikacji Spring-MVC:
Na
we-mvc-config.xml
dodałam zaledwie klas adnotacją z @Controller:Na
applicationContext.xml
plikach dodałem całą resztę:źródło