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?

Author: Cœur, 2012-07-29

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: Kontekst servleta i roota.

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

 207
Author: Boris Treukhov,
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.

 30
Author: JavaDev,
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>
 7
Author: Ben Tennyson,
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:

Typowa hierarchia kontekstowa w Spring Web MVC

 4
Author: Nick Allen,
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