Contesti di root e child Prima di leggere oltre, ti preghiamo di comprendere che -
La primavera può avere più contesti alla volta. Uno di questi sarà il contesto radice e tutti gli altri contesti saranno contesti figlio.
Tutti i contesti figlio possono accedere ai bean definiti nel contesto radice; ma il contrario non è vero. Il contesto di root non può accedere ai bean di contesti figlio.
ApplicationContext:
applicationContext.xml è la configurazione del contesto radice per ogni applicazione web. Spring carica il file applicationContext.xml e crea ApplicationContext per l'intera applicazione. Ci sarà un solo contesto applicativo per applicazione web. Se non stai dichiarando esplicitamente il nome del file di configurazione del contesto in web.xml usando il parametro contextConfigLocation, Spring cercherà applicationContext.xml nella cartella WEB-INF e genererà FileNotFoundException se non è stato possibile trovare questo file.
ContextLoaderListener Esegue il lavoro di inizializzazione effettivo per il contesto dell'applicazione root. Legge un parametro di contesto "contextConfigLocation" e passa il suo valore all'istanza di contesto, analizzandolo in percorsi di file potenzialmente multipli che possono essere separati da un numero qualsiasi di virgole e spazi, ad esempio "WEB-INF / applicationContext1.xml, WEB-INF / applicationContext2.xml”. ContextLoaderListener è facoltativo. Giusto per fare un punto qui: puoi avviare un'applicazione Spring senza mai configurare ContextLoaderListener, solo un web.xml minimo di base con DispatcherServlet.
DispatcherServlet DispatcherServlet è essenzialmente un Servlet (estende HttpServlet) il cui scopo principale è gestire le richieste Web in entrata corrispondenti al modello URL configurato. Prende un URI in entrata e trova la giusta combinazione di controller e vista. Quindi è il front controller.
Quando si definisce un DispatcherServlet nella configurazione di primavera, si fornisce un file XML con voci di classi di controller, mappature di viste ecc. Utilizzando l'attributo contextConfigLocation.
WebApplicationContext Oltre a ApplicationContext, possono esserci più WebApplicationContext in una singola applicazione Web. In parole semplici, ogni DispatcherServlet associato al singolo WebApplicationContext. Il file xxx-servlet.xml è specifico di DispatcherServlet e un'applicazione Web può avere più di un DispatcherServlet configurato per gestire le richieste. In tali scenari, ogni DispatcherServlet avrebbe configurato un xxx-servlet.xml separato. Ma applicationContext.xml sarà comune per tutti i file di configurazione del servlet. Per impostazione predefinita, Spring caricherà il file denominato "xxx-servlet.xml" dalla cartella WEB-INF di webapps dove xxx è il nome servlet in web.xml. Se si desidera modificare il nome di quel nome file o modificare la posizione, aggiungere initi-param con contextConfigLocation come nome param.
Confronto e relazione tra loro:
ContextLoaderListener vs DispatcherServlet
ContextLoaderListener crea il contesto dell'applicazione root. Le voci DispatcherServlet creano un contesto di applicazione figlio per voce servlet. I contesti secondari possono accedere ai bean definiti nel contesto principale. I bean nel contesto radice non possono accedere ai bean nei contesti figlio (direttamente). Tutti i contesti vengono aggiunti a ServletContext. È possibile accedere al contesto principale utilizzando la classe WebApplicationContextUtils.
Dopo aver letto la documentazione di primavera, la seguente è la comprensione:
a) I contesti applicativi sono gerarchici, così come i contesti WebApplication. Consultare la documentazione qui.
b) ContextLoaderListener crea un contesto di applicazione Web radice per l'applicazione Web e lo inserisce in ServletContext. Questo contesto può essere utilizzato per caricare e scaricare i bean gestiti a molla indipendentemente dalla tecnologia utilizzata nel livello del controller (Struts o Spring MVC).
c) DispatcherServlet crea il proprio WebApplicationContext e i gestori / controller / risolutore di viste sono gestiti da questo contesto.
d) Quando ContextLoaderListener viene utilizzato in tandem con DispatcherServlet, un contesto di applicazione Web radice viene creato prima come detto in precedenza e un contesto figlio viene creato da DispatcherSerlvet ed è collegato al contesto di applicazione radice. Consultare la documentazione qui.
Quando lavoriamo con Spring MVC e utilizziamo anche Spring nel livello dei servizi, forniamo due contesti applicativi. Il primo è configurato utilizzando ContextLoaderListener e l'altro con DispatcherServlet
Generalmente, verranno definiti tutti i bean correlati a MVC (controller e viste, ecc.) Nel contesto DispatcherServlet e tutti i bean trasversali come sicurezza, transazione, servizi ecc. Nel contesto di root tramite ContextLoaderListener.
Fare riferimento a questo per maggiori dettagli:
https://siddharthnawani.blogspot.com/2019/10/contextloaderlistener-vs.html