Kolejność ładowania contextConfigLocation w sieci.xml projektu Spring Servlet
Załóżmy, że mam projekt Spring Java i próbuję go skonfigurować jako servlet serwera www. Oto okrojona wersja web.plik xml:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/generalApplicationContext.xml
</param-value>
</context-param>
<servlet>
<servlet-name>my-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/specificApplicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>my-servlet</servlet-name>
<url-pattern>/foo/*</url-pattern>
</servlet-mapping>
Najważniejsze jest to, że podałem dwa pliki XML do załadowania. Jeden jest ogólny dla całej mojej aplikacji, podczas gdy drugi jest specyficzny dla" my-servlet " servlet. W przypadku konfiguracji z jednym mapowaniem serwletów nie miałoby to sensu. Jednak mój projekt ma wiele mapowań serwletów i każdy z nich ma określone ustawienia sprężyny do nich.
Moje pytanie: który contextConfigLocation zostanie załadowany jako pierwszy do wiosny? Czy będzie to ogólny tekst wniosku.xml lub będzie to specyficzny applicationkontekst.xml? Co ważniejsze, czy kolejność załadunku ma znaczenie? Z moich wysiłków debugowania wydaje się oczywiste, że tak, ponieważ dostaję różne błędy, gdy przenoszę jakąś niezależną konfigurację sprężyny z jednego pliku do drugiego.
NB: To, czy używanie wielu konfiguracji sprężyn dla wielu mapowań serwletów jest dobrą praktyką, jest dyskusyjne. To samo dotyczy XML config zamiast nowego Java config. Ale nie o to próbuję zapytać. Spróbujmy skupić się na moim głównym pytaniu.
4 answers
generalApplicationContext.xml
jest Tym, który zostanie załadowany jako pierwszy, ponieważ jest to ApplicationContext
załadowany ContextLoaderListener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/generalApplicationContext.xml
</param-value>
</context-param>
specificApplicationContext.xml
jest w rzeczywistości kontekstem potomnym powyższego załadowanego generalApplicationContext.xml
i będzie to WebApplicationContext
<servlet>
<servlet-name>my-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/specificApplicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>my-servlet</servlet-name>
<url-pattern>/foo/*</url-pattern>
</servlet-mapping>
I tak kolejność załadunku ma znaczenie. Ponieważ gdy kontekst rodzica jest ładowany wszystkie wymagane zależności muszą być spełnione.
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-12-18 05:45:41
Poniższa część ładuje plik kontekstowy i tworzy ApplicationContext . Kontekst ten może na przykład zawierać składniki, takie jak usługi transakcyjne warstwy średniej, obiekty dostępu do danych lub inne obiekty, które mogą być używane (i ponownie używane) w całej aplikacji. Będzie jeden kontekst aplikacji dla każdej aplikacji.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/generalApplicationContext.xml
</param-value>
</context-param>
Drugim kontekstem jest Webaplicationcontext , który jest kontekstem potomnym kontekstu aplikacji . Każdy DispatcherServlet
zdefiniowana w aplikacji webowej Spring będzie miała skojarzoną WebApplicationContext
. Inicjalizacja WebApplicationContext
dzieje się tak:
<servlet>
<servlet-name>my-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/specificApplicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
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
2017-05-23 10:31:30
Czy jest lepszy sposób na to, aby dzienniki debugowania Spring same powiedziały Ci kolejność.
Jeśli chcesz dostać się do kodu Możesz również spojrzeć na org.springframework.web.servlet.FrameworkServlet
(DispatcherServlet
po prostu włącz logger "org.springframework.web.servlet"
, aby debugować poziom w preferowanym frameworku logowania
Oto jak zwykle wyglądałyby logi-oczywiście kontekst główny jest ładowany jako pierwszy i jest ustawiony jako rodzic dla heirarchii kontekstu - the kontekst servleta jest ładowany dalej.
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from ServletContext resource [/WEB-INF/spring/generalApplicatonContext.xml]
INFO : org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 256 ms
DEBUG: org.springframework.web.servlet.DispatcherServlet - Initializing servlet 'my-servlet'
INFO :Initializing Spring FrameworkServlet 'appServlet'
INFO : org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'my-servlet': initialization started
DEBUG: org.springframework.web.servlet.DispatcherServlet - Servlet with name 'appServlet' will try to create custom WebApplicationContext context of class 'org.springframework.web.context.support.XmlWebApplicationContext', using parent context [Root WebApplicationContext: startup date [Fri May 15 17:08:24 IST 2015]; root of context hierarchy
DEBUG: Loading XML bean definitions from ServletContext resource [/WEB-INF/spring/specificApplicationContext.xml
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
2015-05-15 12:04:05
Jeśli posiadasz ContextLoaderListener w swojej sieci.XML spring załaduje General applicationcontext.XML pierwszy. To stworzy fasolki i dostarczy im wszystkie serwlety i filtry. Ten xml powinien mieć wspólne klasy, beans, które są używane w Twojej aplikacji.
Później kontener spring załaduje specificapplicationkontekst.xml , ponieważ w konfiguracji servlet ' a masz obciążenie przy starcie. Jeśli nie podasz obciążenia podczas uruchamiania, to specific applicationkontekst.xml zostanie załadowany, gdy pierwsze żądanie trafi do Twojej aplikacji z określonym wzorcem url.
Jako twoje pytanie, gdy przeniesiesz springconfig z jednej konfiguracji do drugiej, zmieni to dostępność zasobów aplikacji do kontenera. Jeśli określisz Kontroler beans w General applicationkontekst.xml i nie podajesz ich w specificapplicationkontekst.xml wtedy twój DispatcherServlet nie znajdzie mapowań, więc zobaczysz Błąd 404.
Jeśli chcesz utworzyć kilka obiektów bean na żądanie, możesz utworzyć jeszcze jeden servlet-config, aby załadować ten konkretny configurationfile2.xml i Mapuj do wzorca url.
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-12-18 07:26:55