¿Por qué Spring MVC necesita al menos dos contextos?

En Spring MVC, hay dos contextos. Uno es el contexto de la aplicación o el contexto global que arranca ContextLoaderListener . Toma todos los archivos de configuración mencionados en el parámetro contextConfigLocation .

Ahora, si también está utilizando Spring MVC, se necesita el servlet Dispatcher, que inicia otro contenedor que también se conoce como contenedor de aplicaciones web. Este contenedor toma el contenedor global como primario.

Al integrar struts1 con spring, solo hay un contexto. ¿Por qué Spring mvc necesita dos? ¿Es posible usar solo un contexto cuando se usa spring mvc?

¡Gracias!

Imagine que tiene dos despachadores separados, cada uno con un objective diferente y cada uno con sus propias dependencias. Los configuraría de forma independiente utilizando contextos separados.

Si hay alguna configuración compartida, esto puede ir en el contexto ‘global’.

No creo que sea posible tener solo un contexto usando DispatcherServlet, ya que crea su propio contexto y lo vincula al contexto principal (a través de la superclase FrameworkServlet).

FrameworkServlet.createWebApplicationContext

Tener un contexto de aplicación web raíz más un contexto de servlet hijo es solo una opción. Si sabe que su aplicación no tendrá un segundo servlet, es posiblemente más simple tener un solo contexto Spring para toda la aplicación web.

Puede lograr esa configuración simplemente eliminando ContextLoaderListener (y el contextConfigLocation context-param contextConfigLocation ) de su web.xml y moviendo todas las definiciones de bean al xml que define el contexto del servlet ( [servlet-name]-servlet.xml ).

Esto es posible porque a FrameworkServlet (superclase de DispatcherServlet ) no le importa si hay un contexto de aplicación raíz al crear el contexto de servlet. Simplemente transmite el contexto raíz como padre si está disponible. Vea el código relacionado aquí .

Verifique esta respuesta Acerca de varios contenedores en el marco de spring

Sí, puedes tener un solo contexto.

Para la reutilización de código, sería mejor aislar los servicios en Application Context en lugar de WebApplicationContext, pero esto no es obligatorio. Solo puede conservar webApplicationcontext.