Wie ich verstehe, wird eine Spring-basierte Webanwendung wie folgt initialisiert:
Schritt 1 : Servlet container (e.g. Tomcat)
ermittelt die Implementierung von ServletContainerInitializer
, was SpringServletContainerInitializer
ist.
Schritt 2 : SpringServletContainerInitializer
erstellt DispatcherServlet
und ContextLoaderListener
Schritt 3 : DispatcherServlet
erstellt servlet application context
. Und ContextLoaderListener
erstellt root application context
.
Schritt 1 ist in Servlet 3.0 spec definiert. Schritt 2, 3 sind vollständig von Spring definiert.
Ich kann den rationalen Ansatz von web
Beans im Servlet-Kontext und non-web
Beans im Stammkontext sehen. Aber warum müssen wir diese 2 Kontexte an verschiedenen Orten erstellen, also DispatcherServlet
und ContextLoaderListener
?
Wenn all nur nur ist, um alles Notwendige vorzubereiten, erstellen Sie einfach beide Kontexte in ContextLoaderListener
, da sie sichtbar sind als die main()
-Methode der gesamten Webanwendung. Ich denke, das ist mehr Logik und der aktuelle Ansatz verkompliziert nur die Dinge.
Basierend auf @ Shailendras Antwort, zeichne ich dies:
Nach meinem Verständnis hat Spring die application context
-Konzepte eingeführt und speichert sie in Servlet Context
. Servlet Context ist ein Konzept, das von Java Servlet technolgoy eingeführt wurde.
Ich denke, die DispatcherServlet
Implementierung sollte eine Membervariable haben, die key
in servlet application context
in servlet context
enthält. So kann es auf seinen eigenen Kontext zugreifen. Vielleicht ist der Schlüssel der Servlet-Name.
Und der root application context
sollte einen bekannten Schlüssel haben, damit jeder darauf zugreifen kann.
Der bekannte Schlüssel für root application context
ist dies:
(in org.springframework.web.context.WebApplicationContext
)
Der DispatcherServlet
hat einen Verweis auf seinen WebApplicationContext
. Es erbt das folgende Mitglied von FrameworkServlet
:
Und
%Vor%Aber warum müssen wir diese zwei Kontexte an verschiedenen Orten erstellen, d. h. DispatcherServlet und ContextLoaderListener
Weil die beiden Kontexte unterschiedlich sein sollen, aber dennoch eine hierarchische Beziehung haben, um überschreiben zu können. Normalerweise ist der mit ContextLoaderListener
geladene Kontext ein "root" -Kontext, der zu der gesamten Anwendung gehört, während der mit DispatcherServlet
initialisierte Kontext tatsächlich spezifisch für dieses Servlet ist. Technisch gesehen können Sie mehrere Servlets in einer Anwendung haben und so mehrere Kontexte, die jeweils für das jeweilige Servlet spezifisch sind, aber denselben Wurzelkontext haben. Weitere Details finden Sie in meiner Antwort hier .
Tags und Links java spring tomcat servlets servlet-3.0