- Sind
applicationContext.xml
undspring-servlet.xml
irgendwie in Spring Framework verwandt? - Werden die in deklarierten Eigenschaftendateien
applicationContext.xml
verfügbar seinDispatcherServlet
? - Warum brauche ich
*-servlet.xml
überhaupt eine? Warum reichtapplicationContext.xml
allein nicht aus?
373
Antworten:
Mit Spring können Sie mehrere Kontexte in einer Eltern-Kind-Hierarchie definieren.
Das
applicationContext.xml
definiert die Beans für den "Root-Webapp-Kontext", dh den Kontext, der der Webapp zugeordnet ist.Das
spring-servlet.xml
(oder wie auch immer Sie es nennen) definiert die Beans für den App-Kontext eines Servlets. In einer Webanwendung können viele davon vorhanden sein, eine pro Federservlet (z. B.spring1-servlet.xml
für Servletspring1
,spring2-servlet.xml
für Servletspring2
).Bohnen in
spring-servlet.xml
können auf Bohnen verweisenapplicationContext.xml
, aber nicht umgekehrt.Alle Spring MVC-Controller müssen in den
spring-servlet.xml
Kontext gehen.In den meisten einfachen Fällen ist der
applicationContext.xml
Kontext nicht erforderlich. Es wird im Allgemeinen verwendet, um Beans zu enthalten, die von allen Servlets in einer Webanwendung gemeinsam genutzt werden. Wenn Sie nur ein Servlet haben, ist es nicht wirklich sinnvoll, es sei denn, Sie haben eine bestimmte Verwendung dafür.quelle
Szenario 1
In der Client-Anwendung (Anwendung ist keine Webanwendung, z. B. Swing-App)
Keine Notwendigkeit für web.xml . ApplicationContext als Container zum Abrufen des Bean-Dienstes. Kein Webserver-Container erforderlich. In test-client.xml kann es eine einfache Bean ohne Remoting und eine Bean mit Remoting geben.
Schlussfolgerung : In Szenario 1 applicationContext und
DispatcherServlet
sind nicht verwandt.Szenario 2
In einer Serveranwendung (auf dem Server bereitgestellte Anwendung, z. B. Tomcat). Zugriff auf den Dienst über Remoting vom Client-Programm (z. B. Swing-App)
Definieren Sie den Listener in web.xml
Beim Serverstart werden
ContextLoaderListener
in applicationContext.xml definierte Beans instanziiert .Angenommen, Sie haben in applicationContext.xml Folgendes definiert :
Die Beans werden aus allen vier Konfigurationsdateien test1.xml , test2.xml , test3.xml , test4.xml instanziiert .
Schlussfolgerung : In Szenario 2 applicationContext und
DispatcherServlet
sind nicht verwandt.Szenario 3
In einer Webanwendung mit Feder MVC.
In web.xml definieren Sie:
Wenn Tomcat gestartet wird, werden die in springweb-servlet.xml definierten Beans instanziiert.
DispatcherServlet
erstreckt sichFrameworkServlet
. InFrameworkServlet
Bean erfolgt die Instanziierung für Springweb. In unserem Fall ist springweb FrameworkServlet.Schlussfolgerung : In Szenario 3 applicationContext und
DispatcherServlet
sind nicht verwandt.Szenario 4
In Webanwendung mit Feder MVC. springweb-servlet.xml für servlet und applicationContext.xml für den Zugriff auf den Geschäftsdienst innerhalb des Serverprogramms oder für den Zugriff auf den DB-Dienst in einem anderen Serverprogramm.
In web.xml sind folgende definiert:
ContextLoaderListener
Instanziiert beim Start des Servers die in applicationContext.xml definierten Beans . vorausgesetzt, Sie haben hier erklärt:Die Beans werden alle aus allen vier test1.xml , test2.xml , test3.xml , test4.xml instanziiert . Nach Abschluss der in applicationContext.xml definierten Bean-Instanziierung werden in springweb-servlet.xml definierte Beans instanziiert.
Die Instanziierungsreihenfolge lautet also: Root (Anwendungskontext), dann FrameworkServlet.
Jetzt sollte klar sein, warum sie in welchem Szenario wichtig sind.
quelle
DispatcherServlet
wird nicht aufgerufen, wenn die URL nicht mit .action endet?Ein weiterer Punkt, den ich hinzufügen möchte. In
spring-servlet.xml
enthalten ist der Komponentenscan für das Controller-Paket. Im folgenden Beispiel enthalten wir Filteranmerkungen für das Controller-Paket.In
applicationcontext.xml
fügen wir Filter für das verbleibende Paket ohne Controller hinzu.quelle
@Controller
Beans im Servlet-Kontext scannen (erforderlich von Spring MVC).In einfachen Worten,
applicationContext.xml
Definiert die Beans, die von allen Servlets gemeinsam genutzt werden. Wenn Ihre Anwendung mehr als ein Servlet hat, istapplicationContext.xml
es sinnvoller , die allgemeinen Ressourcen im zu definieren .spring-servlet.xml
Definiert die Beans, die sich nur auf dieses Servlet beziehen. Hier ist es das Dispatcher-Servlet. Daher müssen Ihre Spring MVC-Controller in dieser Datei definiert sein.Es ist nichts Falsches daran, alle Beans in der zu definieren,
spring-servlet.xml
wenn Sie nur ein Servlet in Ihrer Webanwendung ausführen.quelle
Wenn Sie in der Servlet-Technologie eine Eingabe an ein bestimmtes Servlet übergeben möchten, müssen Sie den init-Parameter wie im folgenden Code übergeben.
Wenn Sie einige Eingaben übergeben möchten, die für alle Servlets gleich sind, müssen Sie diesmal die Kontextparameter konfigurieren. Beispiel
Genau so müssen wir, wenn wir mit Spring MVC arbeiten, dem von Spring bereitgestellten vordefinierten Servlet, das DispatcherServlet über init param ist, einige Informationen bereitstellen. Die Konfiguration ist also wie folgt: Hier stellen wir DispatcherServlet die Datei spring-servlet.xml als init-Parameter zur Verfügung.
Wieder brauchen wir einen Kontextparameter. Das gilt für die gesamte Anwendung. So können wir den Stammkontext applicationcontext.xml bereitstellen. Die Konfiguration lautet wie folgt:
quelle
Anwendungskontexte bieten eine Möglichkeit zum Auflösen von Textnachrichten, einschließlich der Unterstützung von i18n dieser Nachrichten. Anwendungskontexte bieten eine allgemeine Möglichkeit zum Laden von Dateiressourcen, z. B. Bildern. Anwendungskontexte können Ereignisse in Beans veröffentlichen, die als Listener registriert sind. Bestimmte Operationen am Container oder an den Beans im Container, die programmgesteuert mit einer Bean Factory behandelt werden müssen, können in einem Anwendungskontext deklarativ behandelt werden. ResourceLoader-Unterstützung: Die Ressourcenschnittstelle von Spring bietet eine flexible generische Abstraktion für den Umgang mit Ressourcen auf niedriger Ebene. Ein Anwendungskontext selbst ist ein ResourceLoader. Daher bietet er einer Anwendung Zugriff auf implementierungsspezifische Ressourceninstanzen. MessageSource-Unterstützung: Der Anwendungskontext implementiert MessageSource, eine Schnittstelle zum Abrufen lokalisierter Nachrichten.
quelle