it-swarm.com.de

Was ist der Unterschied zwischen ApplicationContext und WebApplicationContext in Spring MVC?

Was ist der Unterschied zwischen Anwendungskontext und Webanwendungskontext?

Mir ist bekannt, dass WebApplicationContext für Spring MVC-Architekturanwendungen verwendet wird.

Ich möchte wissen, was ApplicationContext in MVC-Anwendungen verwendet? Und welche Art von Beans sind in ApplicationContext definiert?

163
Sumit Trehan

Webanwendung-Kontext erweiterter Anwendungskontext, der mit dem Standard javax.servlet.ServletContext arbeitet, sodass er mit dem Container kommunizieren kann. 

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

Beans, die in WebApplicationContext instanziiert werden, können ServletContext auch verwenden, wenn sie die ServletContextAware-Schnittstelle implementieren 

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

Die ServletContext-Instanz bietet viele Möglichkeiten, z. B. den Zugriff auf WEB-INF-Ressourcen (XML-Konfigurationen usw.), indem die Methode getResourceAsStream () .. aufgerufen wird. Typischerweise alle in web.xml definierten Anwendungskontexte in einem Servlet Spring Anwendung sind Webanwendungskontexte. Dies gilt sowohl für den Root-Webapp-Kontext als auch für den App-Kontext des Servlets.

Je nach Kontext des Webanwendungskontextes kann es schwieriger sein, Ihre Anwendung zu testen, und Sie müssen möglicherweise die Klasse MockServletContext zum Testen verwenden.

Unterschied zwischen Servlet und Stammkontext Spring ermöglicht das Erstellen von mehrstufigen Anwendungskontexthierarchien, sodass das erforderliche Bean aus dem übergeordneten Kontext abgerufen wird, wenn es nicht im aktuellen Anwendungskontext vorhanden ist. Standardmäßig gibt es in Web-Apps zwei Hierarchieebenen, Root- und Servlet-Kontexte: Servlet and root context

Auf diese Weise können Sie einige Dienste als Singletons für die gesamte Anwendung ausführen (Spring Security-Beans und grundlegende Datenbankzugriffsdienste befinden sich normalerweise hier) und andere als separate Dienste in den entsprechenden Servlets, um Namenskonflikte zwischen Beans zu vermeiden. Zum Beispiel wird ein Servlet-Kontext die Webseiten bereitstellen, und ein anderer wird einen zustandslosen Web-Service implementieren.

Diese Trennung auf zwei Ebenen ist bei Verwendung der Spring-Servlet-Klassen ein Kinderspiel: Um den Kontext der Stammanwendung zu konfigurieren, sollten Sie das context-param -Tag in Ihrer web.xml verwenden

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

(Der Stammanwendungskontext wird von ContextLoaderListener erstellt, der in web.xml deklariert ist

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

) und servlet - Tag für die Servlet-Anwendungskontexte

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

Wenn init-param weggelassen wird, verwendet spring in diesem Beispiel myservlet-servlet.xml.

Siehe auch: Unterschied zwischen applicationContext.xml und spring-servlet.xml in Spring Framework

213
Boris Treukhov

Zurück zu Servlet-Tagen kann web.xml nur einen <context-param> haben. Daher wird nur ein Kontextobjekt erstellt, wenn der Server eine Anwendung lädt und die Daten in diesem Kontext von allen Ressourcen (Ex: Servlets und JSPs) gemeinsam genutzt werden. Dies ist mit dem Namen des Datenbank-Treibers im Kontext identisch, der sich nicht ändert. Auf ähnliche Weise wird bei der Deklaration von contextConfigLocation param in <contex-param> Spring ein Anwendungskontextobjekt erstellt.

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

Sie können mehrere Servlets in einer Anwendung haben. Beispielsweise möchten Sie möglicherweise/sicher/* -Anfragen auf eine Weise und/non-seucre/* auf andere Weise behandeln. Für jedes dieser Servlets können Sie ein Kontextobjekt verwenden, bei dem es sich um einen WebApplicationContext handelt.

<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>
8
Ben Tennyson

Die akzeptierte Antwort ist durch, aber es gibt eine offizielle Erklärung dazu:

Der WebApplicationContext ist eine Erweiterung des einfachen ApplicationContext, der einige zusätzliche Funktionen aufweist, die für Webanwendungen erforderlich sind. Es unterscheidet sich von einem normalen ApplicationContext dadurch, dass es in der Lage ist, Themes aufzulösen (siehe Themes verwenden), und dass es weiß, mit welchem ​​Servlet es verbunden ist (durch einen Link zum ServletContext). Der WebApplicationContext ist an den ServletContext gebunden. Wenn Sie statische Methoden für die RequestContextUtils-Klasse verwenden, können Sie den WebApplicationContext immer nachschlagen, wenn Sie darauf zugreifen möchten.

Zitiert aus Spring Web Framework Referenz

Servlet und Root-Kontext sind übrigens both webApplicationContext:

Typical context hierarchy in Spring Web MVC

7
Nick Allen

Webanwendungskontext , angegeben durch die Schnittstelle WebApplicationContextNAME _ , ist ein Spring-Anwendungskontext für Webanwendungen. Es verfügt über alle Eigenschaften eines normalen Spring-Anwendungskontexts, vorausgesetzt, die Schnittstelle WebApplicationContexterweitert die Schnittstelle ApplicationContextund fügt eine Methode zum Abrufen der Standard-Servlet-API ServletContextfür die Webanwendung hinzu.

Zusätzlich zu den standardmäßigen Spring Bean-Bereichen singletonund prototypestehen in einem Webanwendungskontext drei weitere Bereiche zur Verfügung:

  • request- umfasst eine einzelne Bean-Definition für den Lebenszyklus einer einzelnen HTTP-Anforderung; Das heißt, jede HTTP-Anforderung verfügt über eine eigene Instanz einer Bean, die auf der Grundlage einer einzelnen Bean-Definition erstellt wurde
  • session- legt eine einzelne Bean-Definition für den Lebenszyklus einer HTTP-Sitzung fest
  • application- Gültigkeitsbereich einer einzelnen Bean-Definition für den Lebenszyklus eines ServletContextname__
0
DimaSan

ApplicationContext (Root Application Context): Jede Spring MVC-Webanwendung verfügt über eine applicationContext.xml-Datei, die als Stamm der Kontextkonfiguration konfiguriert ist. Spring lädt diese Datei und erstellt einen applicationContext für die gesamte Anwendung .. Diese Datei wird vom ContextLoaderListener geladen, der als Context-Parameter in der Datei web.xml konfiguriert ist. Und pro Webanwendung gibt es nur einen applicationContext.

WebApplicationContext: WebApplicationContext ist ein webfähiger Anwendungskontext, dh, es verfügt über Servlet-Kontextinformationen . Eine einzelne Webanwendung kann mehrere WebApplicationContext enthalten, und jedes Dispatcher-Servlet (der vordere Controller der Spring MVC-Architektur) ist einem WebApplicationContext zugeordnet . Die webApplicationContext-Konfigurationsdatei * -servlet.xml ist spezifisch für ein DispatcherServlet. Da eine Webanwendung mehrere Dispatcher-Servlets enthalten kann, die für die Bearbeitung mehrerer Anforderungen konfiguriert sind, können pro Webanwendung mehr als eine webApplicationContext-Datei vorhanden sein.

0
Hetal Rachh