2017-03-10 3 views
1

Zuerst kam zu diesem Problem, indem ich mich fragte, wie ich eine Bean der Serviceschicht vom ContextLoaderListener-Anwendungskontext in eine Bean aus dem DispatcherServlet-Kontext autowire/injizieren sollte.Welche Einstellung bewirkt, dass der ContextLoaderListener-Kontext (Stammkontext) der ContextLoaderListener-Kontext über den DispatcherServlet-Kontext ist?

Nehmen wir an, für eine zufällige einfache Situation muss ein PuppyService in PuppyResource auf der tatsächlichen Ressourcen-/Controller-Ebene autowirtet/injiziert werden. Der Puppy-Service zusammen mit dem Puppy-Repository und beliebigen Puppy-Entities würde von der @Configuration-Klasse automatisch in den Kontext des Stamm-/ContextLoaderListeners geladen werden, der einen Komponentenscan in einem anderen Paket durchführt, um die Beans zu holen und sie zu laden ...

Gleichzeitig wäre die Puppy RESOURCE mehr auf der WebMvc-Ebene und in den DispatcherServlet-Kontext geladen.

Von dem, was ich gerade gelesen habe, und jetzt hoffentlich zu verstehen, ist der Stammkontext eigentlich der "Eltern" -Kontext des von DispatcherServlet erstellten Kontexts. Dies bedeutet, dass Beans, die sich im Root-Kontext befinden, tatsächlich in jede Bean, die sich in dem von DispatcherServlet erstellten Kontext befindet, automatisch mit dem Autowired/injiziert werden können. Ich habe gerade über dieses Konzept von "verschachtelten" Kontexten erfahren. Ist das genau?

Wenn dies richtig ist, wo wird dann die Konfiguration festgelegt, um den Stammkontext zum übergeordneten Kontext zu machen? Derzeit, wenn ich den Servlet/Listener konfiguriere, mache ich dies über eine benutzerdefinierte Implementierung von WebApplicationInitializer, wobei ich einfach zwei Kontexte erzeuge, diese jeweils in eine DispatcherServlet-Instanz und eine ContextLoaderListener-Instanz lade und diese dann jeweils im Servlet registriere . Ich vermute irgendwo dort, der ContextLoaderListener Anwendungskontext wird automatisch auf den 'Eltern' gesetzt.

Könnte jemand das kurz erklären? Vielen Dank.

Antwort

0

Das Verhalten ist in DispatcherServlet integriert. Das Javadoc definiert den Stammanwendungskontext.

Nur die Wurzel Anwendungskontext als falls durch ContextLoaderListener, geladen wird, wird gemeinsam genutzt werden.

Die javadoc von ContextLoaderListener auch erklärt

Bootstrap Zuhörer Spring Wurzel WebApplicationContext zu starten und herunterfahren.

Und Sie unter der Annahme, verwendet die DispatcherServlet constructor that receives a WebApplicationContext,

Wenn der gegebene Kontext nicht bereits einen Elternteil hat, der Wurzel Anwendungskontext wird als Mutter eingestellt werden.

Sie erhalten dieses Verhalten automatisch.

wieder aus dem javadoc,

Dieser Konstruktor ist in Servlets 3.0+ Umgebungen, in denen instanzbasierte Registrierung von Servlets ist möglich durch den ServletContext.addServlet(java.lang.String, java.lang.String) API nützlich.

Dies ist, was die gemeinsame AbstractDispatcherServletInitializer verwendet, um Ihre Spring MVC-Anwendung einzurichten.

+0

Habe ich etwas falsch gemacht? –

Verwandte Themen