Jaka jest różnica między ApplicationContext a WebApplicationContext w Spring MVC?

193

Jaka jest różnica między kontekstem aplikacji a kontekstem aplikacji sieci Web?

Wiem, że WebApplicationContextjest używany w aplikacjach zorientowanych na architekturę Spring MVC?

Chcę wiedzieć, do czego służy ApplicationContextaplikacje MVC? A w jakim rodzaju fasoli są zdefiniowane ApplicationContext?

Sumit Trehan
źródło
5
Nie wierzę, że jest to duplikat stackoverflow.com/questions/3652090/... To pytanie dotyczy zawartości web.xmlpliku; to pytanie dotyczy niektórych klas wiosennych.
Raedwald
@ Raedwald to nieprawda. Drugie pytanie nie mówi o tym, web.xmlale chodzi o warianty konfiguracji komponentu bean Spring XML ApplicationContexti WebApplicationContext. Wszystkie definicje fasoli w applicationContext.xmlbędą dostępne, ApplicationContextpodczas gdy wszystkie definicje fasoli w *-servlet.xmlbędą dostępne w WebApplicationContext.
g00glen00b

Odpowiedzi:

228

Kontekst aplikacji sieciowej Rozszerzony kontekst aplikacji, który został zaprojektowany do pracy ze standardowym javax.servlet.ServletContext, aby mógł komunikować się z kontenerem.

public interface WebApplicationContext extends ApplicationContext {
    ServletContext getServletContext();
}

Fasole, tworzone w WebApplicationContext, będą mogły także korzystać z ServletContext, jeśli zaimplementują interfejs ServletContextAware

package org.springframework.web.context;
public interface ServletContextAware extends Aware { 
     void setServletContext(ServletContext servletContext);
}

Istnieje wiele rzeczy, które można zrobić z instancją ServletContext, na przykład dostęp do zasobów WEB-INF (konfiguracje xml itp.) Poprzez wywołanie metody getResourceAsStream (). Zazwyczaj wszystkie konteksty aplikacji zdefiniowane w pliku web.xml w aplikacji wiosny serwletu są kontekstami aplikacji sieci Web, dotyczy to zarówno głównego kontekstu aplikacji internetowej, jak i kontekstu aplikacji serwletu.

Ponadto, w zależności od kontekstu aplikacji sieciowej, jej testowanie może być nieco trudniejsze, a do testowania może być konieczne użycie klasy MockServletContext .

Różnica między serwletem a kontekstem głównym Wiosna pozwala budować wielopoziomowe hierarchie kontekstów aplikacji, więc wymagana fasola zostanie pobrana z kontekstu nadrzędnego, jeśli nie będzie obecna w bieżącym kontekście aplikacji. W aplikacjach internetowych domyślnie istnieją dwa poziomy hierarchii, kontekstów korzeniowe i serwletów: Kontekst serwletu i katalogu głównego.

Umożliwia to uruchamianie niektórych usług jako singletonów dla całej aplikacji (zwykle znajdują się tutaj komponenty bean Spring Security i podstawowe usługi dostępu do bazy danych), a inne jako oddzielne usługi w odpowiednich serwletach, aby uniknąć konfliktów nazw między komponentami bean. Na przykład jeden kontekst serwletu będzie obsługiwał strony internetowe, a inny zaimplementuje bezpaństwową usługę internetową.

Ta dwupoziomowa separacja pojawia się po wyjęciu z pudełka podczas korzystania z wiosennych klas serwletów: aby skonfigurować kontekst aplikacji root, należy użyć tagu context-param w pliku web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/root-context.xml
            /WEB-INF/applicationContext-security.xml
    </param-value>
</context-param>

(kontekst aplikacji root jest tworzony przez ContextLoaderListener, który jest zadeklarowany w pliku web.xml

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> 

) i znacznik serwletu dla kontekstów aplikacji serwletu

<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>

Pamiętaj, że jeśli parametr init zostanie pominięty, to w tym przykładzie wiosna użyje pliku myservlet-servlet.xml.

Zobacz także: Różnica między applicationContext.xml a spring-servlet.xml w Spring Framework

Boris Treukhov
źródło
2
Wielkie dzięki za odpowiedź. Słyszałem, że istnieją dwa typy kontekstów używanych również w aplikacji internetowej. Jeden służy jako kontekst aplikacji root, gdzie dostarczane są definicje niezwiązane z siecią, np. Usługa, konfiguracje dao itp., A drugi służy do konfiguracji specyficznej dla sieci, takiej jak mapowania modułu obsługi itp. Poprzednia służy jako kontekst nadrzędny, a druga jako kontekst podrzędny . Chcę wiedzieć, jak zadeklarować tę strukturę. Słyszałem o niektórych wywołaniach zwrotnych ContextListener. Ale jestem dość niejasny.
Sumit Trehan
1
Taka struktura jest zakodowana na stałe w narzędziach serwletu Spring, w wiosennej aplikacji internetowej zawsze są co najmniej dwa konteksty aplikacji, zobacz zaktualizowaną odpowiedź, mam nadzieję, że to pomoże.
Boris Treukhov
Doskonały opis. Miałem wątpliwości co do tego scenariusza.
Ponieważ
„wymagana fasola zostanie pobrana z kontekstu nadrzędnego, jeśli nie jest obecna w bieżącym kontekście aplikacji”. Czy możesz wyjaśnić jak? W jaki sposób kontekst aplikacji internetowej może uzyskać dostęp do komponentów bean w kontekście aplikacji root? Link do dowolnego przykładu?
anir
14

Wracając do dni serwletu, plik web.xml może mieć tylko jeden <context-param>, więc tylko jeden obiekt kontekstu jest tworzony, gdy serwer ładuje aplikację, a dane w tym kontekście są współużytkowane przez wszystkie zasoby (np. Serwlety i strony JSP). To samo, co posiadanie nazwy sterownika bazy danych w kontekście, który się nie zmieni. Podobnie, kiedy deklarujemy parametr contextConfigLocation na <contex-param>wiosnę, tworzy jeden obiekt kontekstu aplikacji.

 <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.myApp.ApplicationContext</param-value>
 </context-param>

W aplikacji możesz mieć wiele serwletów. Na przykład możesz chcieć obsługiwać / zabezpieczyć / * żądania w jeden sposób i / non-seucre / * w inny sposób. Dla każdego z tych serwletów możesz mieć obiekt kontekstowy, którym jest WebApplicationContext.

<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>
Ben Tennyson
źródło
14

Odpowiedź została zaakceptowana, ale istnieje oficjalne wyjaśnienie:

WebApplicationContext jest rozszerzeniem zwykłego ApplicationContext, który ma dodatkowe funkcje niezbędne dla aplikacji internetowych. Różni się od zwykłego ApplicationContext tym, że jest w stanie rozwiązywać kompozycje (patrz Używanie kompozycji) i że wie, z jakim serwletem jest powiązany (poprzez link do ServletContext). WebApplicationContext jest związany w ServletContext, a za pomocą metod statycznych w klasie RequestContextUtils zawsze możesz wyszukać WebApplicationContext, jeśli potrzebujesz do niego dostępu.

Cytowany z referencji Spring Web Framework

Nawiasem mówiąc serwletów i korzeniowe kontekst są zarówno webApplicationContext:

Typowa hierarchia kontekstu w Spring Web MVC

Nick Allen
źródło
dobre wytłumaczenie.
Shashank
6

ApplicationContext (Root Application Context): Każda aplikacja sieciowa Spring MVC ma plik applicationContext.xml, który jest skonfigurowany jako katalog główny konfiguracji kontekstowej. Spring ładuje ten plik i tworzy kontekst aplikacji dla całej aplikacji. Ten plik jest ładowany przez ContextLoaderListener, który jest skonfigurowany jako parametr kontekstowy w pliku web.xml. I będzie tylko jedna aplikacja Kontekst na aplikację internetową.

WebApplicationContext: WebApplicationContext jest kontekstem aplikacji obsługującym sieć, tzn. Zawiera informacje o kontekście serwletu. Pojedyncza aplikacja internetowa może mieć wiele WebApplicationContext, a każdy serwlet Dispatcher (który jest frontowym kontrolerem architektury Spring MVC) jest powiązany z WebApplicationContext. Plik konfiguracyjny webApplicationContext * -servlet.xml jest specyficzny dla DispatcherServlet. Ponieważ aplikacja sieci Web może mieć więcej niż jeden serwlet programu rozsyłającego skonfigurowany do obsługi wielu żądań, na aplikację internetową może przypadać więcej niż jeden plik webApplicationContext.

Hetal Rachh
źródło
3

Kontekst aplikacji sieci Web określony przez WebApplicationContextinterfejs jest kontekstem aplikacji Spring dla aplikacji sieci web. Ma wszystkie właściwości zwykłego kontekstu aplikacji Spring, biorąc pod uwagę, że WebApplicationContextinterfejs rozszerza ApplicationContextinterfejs i dodaje metodę pobierania standardowego interfejsu API serwletu ServletContextdla aplikacji sieci web.

Oprócz standardowych zasięgów fasoli wiosennej singletonoraz prototypew kontekście aplikacji internetowej dostępne są trzy dodatkowe zakresy:

  • request- określa definicję pojedynczego komponentu bean do cyklu życia pojedynczego żądania HTTP; to znaczy każde żądanie HTTP ma własną instancję komponentu bean utworzonego na podstawie definicji pojedynczego komponentu bean
  • session - określa definicję pojedynczego komponentu bean do cyklu życia sesji HTTP
  • application - obejmuje definicję pojedynczej fasoli w cyklu życia ServletContext
DimaSan
źródło