Spring: Warum "root" Anwendungskontext und "Servlet" Anwendungskontext von verschiedenen Parteien erstellt werden?

9

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.

ADD 1

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.

HINZUFÜGEN 2

Der bekannte Schlüssel für root application context ist dies:

(in org.springframework.web.context.WebApplicationContext )

%Vor%

ADD 3

Der DispatcherServlet hat einen Verweis auf seinen WebApplicationContext . Es erbt das folgende Mitglied von FrameworkServlet :

%Vor%

Und

%Vor%     
smwikipedia 16.10.2015, 05:57
quelle

1 Antwort

4
  

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 .

    
Shailendra 16.10.2015, 06:17
quelle