Wurzel- und Kinderkontexte Bevor Sie weiterlesen, verstehen Sie bitte, dass -
Der Frühling kann mehrere Kontexte gleichzeitig haben. Einer von ihnen ist der Stammkontext, und alle anderen Kontexte sind untergeordnete Kontexte.
Alle untergeordneten Kontexte können auf die im Stammkontext definierten Beans zugreifen. aber das Gegenteil ist nicht wahr. Der Stammkontext kann nicht auf untergeordnete Kontext-Beans zugreifen.
Anwendungskontext:
applicationContext.xml ist die Stammkontextkonfiguration für jede Webanwendung. Spring lädt die Datei applicationContext.xml und erstellt den ApplicationContext für die gesamte Anwendung. Pro Webanwendung gibt es nur einen Anwendungskontext. Wenn Sie den Namen der Kontextkonfigurationsdatei in web.xml nicht explizit mit dem Parameter contextConfigLocation deklarieren, sucht Spring im Ordner WEB-INF nach applicationContext.xml und löst FileNotFoundException aus, wenn diese Datei nicht gefunden werden konnte.
ContextLoaderListener Führt die eigentliche Initialisierungsarbeit für den Stammanwendungskontext aus. Liest einen Kontextparameter "contextConfigLocation" und übergibt seinen Wert an die Kontextinstanz. Dabei wird er in möglicherweise mehrere Dateipfade analysiert, die durch eine beliebige Anzahl von Kommas und Leerzeichen getrennt werden können, z. B. "WEB-INF / applicationContext1.xml, WEB-INF /" applicationContext2.xml ”. ContextLoaderListener ist optional. Um hier einen Punkt zu verdeutlichen: Sie können eine Spring-Anwendung starten, ohne jemals ContextLoaderListener zu konfigurieren, nur eine grundlegende minimale web.xml mit DispatcherServlet.
DispatcherServlet DispatcherServlet ist im Wesentlichen ein Servlet (es erweitert HttpServlet), dessen Hauptzweck darin besteht, eingehende Webanforderungen zu verarbeiten, die dem konfigurierten URL-Muster entsprechen. Es nimmt eine eingehende URI und findet die richtige Kombination aus Controller und Ansicht. Es ist also der Frontcontroller.
Wenn Sie ein DispatcherServlet in der Frühjahrskonfiguration definieren, stellen Sie eine XML-Datei mit Einträgen von Controller-Klassen, Ansichtszuordnungen usw. mithilfe des Attributs contextConfigLocation bereit.
WebApplicationContext Neben ApplicationContext können in einer Webanwendung mehrere WebApplicationContext vorhanden sein. Mit einfachen Worten, jedes DispatcherServlet, das einem einzelnen WebApplicationContext zugeordnet ist. Die Datei xxx-servlet.xml ist spezifisch für das DispatcherServlet. In einer Webanwendung kann mehr als ein DispatcherServlet für die Verarbeitung der Anforderungen konfiguriert sein. In solchen Szenarien würde für jedes DispatcherServlet eine separate xxx-servlet.xml konfiguriert sein. ApplicationContext.xml ist jedoch für alle Servlet-Konfigurationsdateien gleich. Spring lädt standardmäßig die Datei "xxx-servlet.xml" aus Ihrem WEB-INF-Ordner für Webanwendungen, wobei xxx der Servlet-Name in web.xml ist. Wenn Sie den Namen dieses Dateinamens oder den Speicherort ändern möchten, fügen Sie initi-param mit contextConfigLocation als Parameternamen hinzu.
Vergleich und Beziehung zwischen ihnen:
ContextLoaderListener vs DispatcherServlet
ContextLoaderListener erstellt den Stammanwendungskontext. DispatcherServlet-Einträge erstellen einen untergeordneten Anwendungskontext pro Servlet-Eintrag. Untergeordnete Kontexte können auf Beans zugreifen, die im Stammkontext definiert sind. Beans im Stammkontext können (direkt) nicht auf Beans in untergeordneten Kontexten zugreifen. Alle Kontexte werden zu ServletContext hinzugefügt. Sie können mit der WebApplicationContextUtils-Klasse auf den Stammkontext zugreifen.
Nach dem Lesen der Spring-Dokumentation gilt Folgendes:
a) Anwendungskontexte sind hierarchisch, ebenso wie WebApplicationContexts. Siehe Dokumentation hier.
b) ContextLoaderListener erstellt einen Root-Webanwendungskontext für die Webanwendung und fügt ihn in den ServletContext ein. Dieser Kontext kann zum Laden und Entladen der Spring-Managed-Beans verwendet werden, unabhängig davon, welche Technologie in der Controller-Schicht (Struts oder Spring MVC) verwendet wird.
c) DispatcherServlet erstellt einen eigenen WebApplicationContext und die Handler / Controller / View-Resolver werden von diesem Kontext verwaltet.
d) Wenn ContextLoaderListener zusammen mit DispatcherServlet verwendet wird, wird zuerst ein Root-Webanwendungskontext erstellt, und ein untergeordneter Kontext wird ebenfalls von DispatcherSerlvet erstellt und an den Root-Anwendungskontext angehängt. Siehe Dokumentation hier.
Wenn wir mit Spring MVC arbeiten und Spring auch in der Serviceschicht verwenden, stellen wir zwei Anwendungskontexte bereit. Der erste wird mit ContextLoaderListener und der andere mit DispatcherServlet konfiguriert
Im Allgemeinen definieren Sie alle MVC-bezogenen Beans (Controller und Ansichten usw.) im DispatcherServlet-Kontext und alle übergreifenden Beans wie Sicherheit, Transaktion, Dienste usw. im Stammkontext von ContextLoaderListener.
Weitere Informationen finden Sie hier:
https://siddharthnawani.blogspot.com/2019/10/contextloaderlistener-vs.html