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?
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: .
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
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>
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:
Webanwendungskontext , angegeben durch die Schnittstelle WebApplicationContext
NAME _ , ist ein Spring-Anwendungskontext für Webanwendungen. Es verfügt über alle Eigenschaften eines normalen Spring-Anwendungskontexts, vorausgesetzt, die Schnittstelle WebApplicationContext
erweitert die Schnittstelle ApplicationContext
und fügt eine Methode zum Abrufen der Standard-Servlet-API ServletContext
für die Webanwendung hinzu.
Zusätzlich zu den standardmäßigen Spring Bean-Bereichen singleton
und prototype
stehen 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 wurdesession
- legt eine einzelne Bean-Definition für den Lebenszyklus einer HTTP-Sitzung festapplication
- Gültigkeitsbereich einer einzelnen Bean-Definition für den Lebenszyklus eines ServletContext
name__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.