Jaka jest różnica między ApplicationContext a Webaplicationcontext w Spring MVC?
Jaka jest różnica między kontekstem aplikacji a kontekstem aplikacji webowej?
Wiem, że WebApplicationContext
jest używany w aplikacjach zorientowanych na architekturę MVC Spring?
Chcę wiedzieć jakie jest zastosowanie ApplicationContext
w aplikacjach MVC? A jakie rodzaje fasoli są zdefiniowane w ApplicationContext
?
4 answers
Web Application context Rozszerzony kontekst aplikacji zaprojektowany do pracy ze standardem javax.servlet.ServletContext , dzięki czemu może komunikować się z kontenerem.
public interface WebApplicationContext extends ApplicationContext {
ServletContext getServletContext();
}
Beans, instantiated in WebApplicationContext will also before to use ServletContext if they implementation Servletcontext interface
package org.springframework.web.context;
public interface ServletContextAware extends Aware {
void setServletContext(ServletContext servletContext);
}
Jest wiele rzeczy do zrobienia z instancją ServletContext, na przykład dostęp do zasobów WEB-INF (XML configs itd.) przez wywołanie metody getResourceAsStream (). Zazwyczaj wszystkie konteksty aplikacji zdefiniowane w sieci.xml w aplikacji Servlet Spring są kontekstami aplikacji webowych, dotyczy to zarówno głównego kontekstu webapp, jak i kontekstu aplikacji servleta.
Ponadto, w zależności od kontekstu aplikacji webowej, może to utrudnić testowanie Twojej aplikacji i może być konieczne użycie klasy mockservletcontext do testowania.
Różnica między serwletem a kontekstem root
Wiosna pozwala na budowanie wielopoziomowych hierarchii kontekstu aplikacji, więc wymagana bean będzie pobierana z kontekstu nadrzędnego, jeśli nie jest obecna w bieżącym kontekście aplikacji. W aplikacjach internetowych domyślnie istnieją dwa poziomy hierarchii, konteksty root i servlet: .
Pozwala to uruchamiać niektóre usługi jako singletony dla całej aplikacji (Spring Security beans i basic database access services zazwyczaj znajdują się tutaj), a inne jako oddzielone usługi w odpowiednie serwlety, aby uniknąć starć nazw między fasolami. Na przykład jeden kontekst servleta będzie obsługiwał strony internetowe, a inny będzie implementował bezstanową usługę internetową.
Ta dwupoziomowa separacja wychodzi z pudełka, gdy używasz klas serwletów spring: aby skonfigurować kontekst aplikacji root powinieneś użyć znacznika context-param w Twojej sieci.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/root-context.xml
/WEB-INF/applicationContext-security.xml
</param-value>
</context-param>
(główny kontekst aplikacji jest tworzony przez ContextLoaderListener , który jest zadeklarowany w www.xml
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
) i Servlet znacznik dla kontekstów aplikacji servlet
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>app-servlet.xml</param-value>
</init-param>
</servlet>
Proszę zauważyć, że jeśli INIT-param zostanie pominięty, to spring użyje myservlet-servlet.xml w tym przykładzie.
Zobacz także: różnica między applicationContext.xml i spring-servlet.xml w Spring Framework
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 12:26:06
ApplicationContext applicationkontekst.xml jest podstawową konfiguracją kontekstu dla każdej aplikacji internetowej. Zastosowanie obciążeń sprężynowychkontekst.plik xml i wytworzy Applicationkontekst dla całej aplikacji. Dla każdej aplikacji webowej będzie tylko jeden kontekst aplikacji. Jeśli nie deklarujesz jawnie nazwy pliku konfiguracyjnego kontekstu w web.xml używając param contextConfigLocation, Spring wyszukuje applicationContext.xml pod katalog WEB-INF i wrzuć FileNotFoundException jeśli nie można znaleźć tego pliku.
Webaplicationcontext Oprócz ApplicationContext, w jednej aplikacji webowej może być kilka Web Applicationcontext. W prostych słowach, każdy DispatcherServlet związany z jednej aplikacji Webkontekst. xxx-servlet.plik xml jest specyficzny dla DispatcherServlet i aplikacja webowa może mieć więcej niż jeden DispatcherServlet skonfigurowany do obsługi żądań. W takich scenriosach każdy Dyspozytor miałby oddzielny xxx-servlet.konfiguracja xml. Ale applicationkontekst.xml będzie wspólny dla wszystkich plików konfiguracyjnych serwletów. Spring domyślnie załaduje plik o nazwie "xxx-servlet.xml " z folderu webapps WEB-INF, gdzie xxx jest nazwą servleta w web.xml. Jeśli chcesz zmienić nazwę tego pliku lub zmienić lokalizację, dodaj Initiative-param z contextConfigLocation jako nazwę param.
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-04-14 14:19:23
Wracając do Servlet days, web.xml może mieć tylko jeden <context-param>
, więc tylko jeden obiekt kontekstowy jest tworzony, gdy serwer ładuje aplikację, a dane w tym kontekście są współdzielone między wszystkimi zasobami (np. Servlety i JSP). Jest to tak samo jak posiadanie nazwy sterownika bazy danych w kontekście, który nie ulegnie zmianie. W podobny sposób, kiedy deklarujemy contextConfigLocation param w <contex-param>
Spring tworzy jeden obiekt kontekstowy aplikacji.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.myApp.ApplicationContext</param-value>
</context-param>
Możesz mieć wiele serwletów w aplikacji. Na przykład możesz chcieć obsługiwać /secure/* w jeden sposób i/ non-seucre / * w inny sposób. Dla każdego z tych serwletów możesz mieć obiekt kontekstowy, który jest Webaplicationcontext.
<servlet>
<servlet-name>SecureSpringDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>com.myapp.secure.SecureContext</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SecureSpringDispatcher</servlet-name>
<url-pattern>/secure/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>NonSecureSpringDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>com.myapp.non-secure.NonSecureContext</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>NonSecureSpringDispatcher</servlet-name>
<url-pattern>/non-secure/*</url-patten>
</servlet-mapping>
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-07-10 19:17:57
Zaakceptowana odpowiedź jest skończona, ale jest oficjalne wyjaśnienie na ten temat:
WebApplicationContext jest rozszerzeniem zwykłego ApplicationContext, które ma kilka dodatkowych funkcji niezbędnych dla aplikacji internetowych. Różni się od normalnego ApplicationContext tym, że jest w stanie rozwiązywać tematy (zobacz Używanie motywów) i że wie, z którym Serwletem jest skojarzony (poprzez link do ServletContext). Webaplicationcontext jest związany w ServletContext, a używając metod statycznych w klasie RequestContextUtils możesz zawsze wyszukać Webaplicationcontext, jeśli potrzebujesz do niego dostępu.
Cytowany z Spring web Framework reference
Przy okazji Servlet i root context to oba webaplicationcontext:
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-09-13 13:46:03