Una aplicación web estándar de Spring (creada por Roo o la plantilla "Spring MVC Project") crea un web.xml con ContextLoaderListener
y DispatcherServlet
. ¿Por qué no solo usan DispatcherServlet
y hacen que cargue la configuración completa?
Entiendo que ContextLoaderListener debe usarse para cargar cosas que no son relevantes para la web y DispatcherServlet se usa para cargar cosas relevantes para la web (Controladores, ...). Y esto da como resultado dos contextos: un contexto primario y uno secundario.
Antecedentes:
Lo hice de esta manera estándar durante varios años.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Handles Spring requests -->
<servlet>
<servlet-name>roo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/spring/webmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Esto a menudo causó problemas con los dos contextos y las dependencias entre ellos. En el pasado siempre pude encontrar una solución, y tengo la fuerte sensación de que esto hace que la estructura / arquitectura del software siempre sea mejor. Pero ahora estoy enfrentando un problema con los eventos de ambos contextos .
- Sin embargo, esto me hace repensar este patrón de dos contextos, y me pregunto: ¿por qué debería meterme en este problema, por qué no cargar todos los archivos de configuración de Spring con uno DispatcherServlet
y eliminarlos por ContextLoaderListener
completo? (Todavía tendré diferentes archivos de configuración, pero solo un contexto).
¿Hay alguna razón para no eliminar el ContextLoaderListener
?
Respuestas:
En su caso, no, no hay razón para mantener el
ContextLoaderListener
yapplicationContext.xml
. Si su aplicación funciona bien solo con el contexto del servlet, eso se queda con eso, es más simple.Sí, el patrón generalmente alentado es mantener cosas que no sean web en el contexto de nivel de aplicación web, pero no es más que una convención débil.
Las únicas razones convincentes para usar el contexto de nivel de aplicación web son:
DispatcherServlet
que necesitan compartir serviciosDelegatingFilterProxy
,OpenEntityManagerInViewFilter
etc)Ninguno de estos se aplica a usted, por lo que la complejidad adicional no está justificada.
Solo tenga cuidado al agregar tareas en segundo plano al contexto del servlet, como tareas programadas, conexiones JMS, etc. Si olvida agregar
<load-on-startup>
a suweb.xml
, entonces estas tareas no se iniciarán hasta el primer acceso del servlet.fuente
DispatcherServlet
sin una configuración, si lo hiciera, no tendría una interfaz web. Todas las cosas de MVC tienen que ir allí.También puede configurar el contexto de la aplicación al revés. Por ejemplo, para hacer que OpenEntityManagerInViewFilter funcione. Configure ContextLoaderListener y luego configure su DispatcherServlet con:
Solo asegúrese de que el valor del parámetro contextConfigLocation esté vacío.
fuente
Quiero compartir lo que he hecho en mi aplicación Spring-MVC:
En el
we-mvc-config.xml
Agregué solo las clases anotadas con @Controller:En los
applicationContext.xml
archivos agregué todo el resto:fuente