Contextos raíz e hijo Antes de seguir leyendo, comprenda que:
La primavera puede tener múltiples contextos a la vez. Uno de ellos será el contexto raíz, y todos los demás contextos serán contextos secundarios.
Todos los contextos secundarios pueden acceder a los beans definidos en el contexto raíz; pero lo contrario no es cierto. El contexto raíz no puede acceder a los contextos secundarios beans.
ApplicationContext:
applicationContext.xml es la configuración del contexto raíz para cada aplicación web. Spring carga el archivo applicationContext.xml y crea el ApplicationContext para toda la aplicación. Solo habrá un contexto de aplicación por aplicación web. Si no está declarando explícitamente el nombre del archivo de configuración de contexto en web.xml utilizando el parámetro contextConfigLocation, Spring buscará el applicationContext.xml en la carpeta WEB-INF y lanzará FileNotFoundException si no puede encontrar este archivo.
ContextLoaderListener Realiza el trabajo de inicialización real para el contexto de la aplicación raíz. Lee un parámetro de contexto "contextConfigLocation" y pasa su valor a la instancia de contexto, analizándolo en rutas de archivos potencialmente múltiples que pueden estar separadas por cualquier número de comas y espacios, por ejemplo, "WEB-INF / applicationContext1.xml, WEB-INF / applicationContext2.xml ". ContextLoaderListener es opcional. Solo para hacer un punto aquí: puede iniciar una aplicación Spring sin configurar ContextLoaderListener, solo un mínimo web.xml básico con DispatcherServlet.
DispatcherServlet DispatcherServlet es esencialmente un Servlet (extiende HttpServlet) cuyo propósito principal es manejar las solicitudes web entrantes que coinciden con el patrón de URL configurado. Se necesita un URI entrante y encuentra la combinación correcta de controlador y vista. Entonces es el controlador frontal.
Cuando define un DispatcherServlet en la configuración de primavera, proporciona un archivo XML con entradas de clases de controlador, asignaciones de vistas, etc. utilizando el atributo contextConfigLocation.
WebApplicationContext Además de ApplicationContext, puede haber múltiples WebApplicationContext en una sola aplicación web. En palabras simples, cada DispatcherServlet asociado con un solo WebApplicationContext. El archivo xxx-servlet.xml es específico del DispatcherServlet y una aplicación web puede tener más de un DispatcherServlet configurado para manejar las solicitudes. En tales escenarios, cada DispatcherServlet tendría un xxx-servlet.xml configurado por separado. Pero applicationContext.xml será común para todos los archivos de configuración de servlet. Spring cargará por defecto el archivo llamado "xxx-servlet.xml" de su carpeta web-INF webapps donde xxx es el nombre del servlet en web.xml. Si desea cambiar el nombre de ese nombre de archivo o cambiar la ubicación, agregue initi-param con contextConfigLocation como nombre de parámetro.
Comparación y relación entre ellos:
ContextLoaderListener vs DispatcherServlet
ContextLoaderListener crea el contexto de la aplicación raíz. Las entradas de DispatcherServlet crean un contexto de aplicación hijo por entrada de servlet. Los contextos secundarios pueden acceder a beans definidos en el contexto raíz. Los beans en el contexto raíz no pueden acceder a los beans en contextos secundarios (directamente). Todos los contextos se agregan a ServletContext. Puede acceder al contexto raíz utilizando la clase WebApplicationContextUtils.
Después de leer la documentación de Spring, lo siguiente es entender:
a) Los contextos de aplicación son jerárquicos y también lo son los WebApplicationContexts. Consulte la documentación aquí.
b) ContextLoaderListener crea un contexto de aplicación web raíz para la aplicación web y lo coloca en el contexto de Servlet. Este contexto se puede utilizar para cargar y descargar los beans gestionados por resorte independientemente de qué tecnología se esté utilizando en la capa del controlador (Struts o Spring MVC).
c) DispatcherServlet crea su propio WebApplicationContext y los manejadores / controladores / resolutores de vista son administrados por este contexto.
d) Cuando ContextLoaderListener se usa junto con DispatcherServlet, se crea un contexto de aplicación web raíz primero como se dijo anteriormente y DispatcherSerlvet también crea un contexto hijo y se adjunta al contexto de aplicación raíz. Consulte la documentación aquí.
Cuando estamos trabajando con Spring MVC y también estamos usando Spring en la capa de servicios, proporcionamos dos contextos de aplicación. El primero se configura con ContextLoaderListener y el otro con DispatcherServlet
En general, definirá todos los beans relacionados con MVC (controlador y vistas, etc.) en el contexto DispatcherServlet, y todos los beans transversales como seguridad, transacciones, servicios, etc. en el contexto raíz por ContextLoaderListener.
Consulte esto para obtener más detalles:
https://siddharthnawani.blogspot.com/2019/10/contextloaderlistener-vs.html