¿Cuál es la diferencia entre ApplicationContext y WebApplicationContext en Spring MVC?

Resuelto Sumit Trehan asked hace 12 años • 4 respuestas

¿Cuál es la diferencia entre contexto de aplicación y contexto de aplicación web?

¿ Soy consciente de que WebApplicationContextse utiliza para aplicaciones orientadas a la arquitectura Spring MVC?

Quiero saber ¿para qué sirve ApplicationContexten las aplicaciones MVC? ¿Y en qué tipo de frijoles se definen ApplicationContext?

Sumit Trehan avatar Jul 29 '12 18:07 Sumit Trehan
Aceptado

Contexto de aplicación web Contexto de aplicación extendido que está diseñado para funcionar con el estándar javax.servlet.ServletContext para que pueda comunicarse con el contenedor.

public interface WebApplicationContext extends ApplicationContext {
    ServletContext getServletContext();
}

Los beans, instanciados en WebApplicationContext, también podrán usar ServletContext si implementan la interfaz ServletContextAware.

package org.springframework.web.context;
public interface ServletContextAware extends Aware { 
     void setServletContext(ServletContext servletContext);
}

Hay muchas cosas que se pueden hacer con la instancia de ServletContext, por ejemplo, acceder a recursos WEB-INF (configuraciones xml, etc.) llamando al método getResourceAsStream(). Normalmente, todos los contextos de aplicación definidos en web.xml en una aplicación servlet Spring son contextos de aplicación web, esto va tanto al contexto raíz de la aplicación web como al contexto de la aplicación del servlet.

Además, dependiendo de las capacidades del contexto de la aplicación web, puede hacer que su aplicación sea un poco más difícil de probar y es posible que necesite usar la clase MockServletContext para realizar pruebas.

Diferencia entre servlet y contexto raíz Spring le permite crear jerarquías de contexto de aplicación multinivel, por lo que el bean requerido se obtendrá del contexto principal si no está presente en el contexto de aplicación actual. En las aplicaciones web, de forma predeterminada, hay dos niveles de jerarquía, contextos raíz y servlet: Servlet y contexto raíz.

Esto le permite ejecutar algunos servicios como singletons para toda la aplicación (los beans Spring Security y los servicios básicos de acceso a bases de datos generalmente residen aquí) y otros como servicios separados en los servlets correspondientes para evitar conflictos de nombres entre beans. Por ejemplo, un contexto de servlet servirá las páginas web y otro implementará un servicio web sin estado.

Esta separación de dos niveles viene lista para usar cuando usa las clases de servlet de primavera: para configurar el contexto de la aplicación raíz, debe usar la etiqueta context-param en su web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/root-context.xml
            /WEB-INF/applicationContext-security.xml
    </param-value>
</context-param>

(El contexto de la aplicación raíz lo crea ContextLoaderListener que se declara en web.xml

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> 

) y etiqueta de servlet para los contextos de la aplicación de servlet

<servlet>
   <servlet-name>myservlet</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>app-servlet.xml</param-value>
   </init-param>
</servlet>

Tenga en cuenta que si se omite init-param, Spring utilizará myservlet-servlet.xml en este ejemplo.

Ver también: Diferencia entre applicationContext.xml y spring-servlet.xml en Spring Framework

Boris Treukhov avatar Jul 29 '2012 12:07 Boris Treukhov

La respuesta aceptada ya está completa, pero hay una explicación oficial al respecto:

WebApplicationContext es una extensión del ApplicationContext simple que tiene algunas características adicionales necesarias para las aplicaciones web. Se diferencia de un ApplicationContext normal en que es capaz de resolver temas (consulte Uso de temas) y sabe a qué Servlet está asociado (al tener un enlace al ServletContext). WebApplicationContext está vinculado a ServletContext y, al utilizar métodos estáticos en la clase RequestContextUtils, siempre puede buscar WebApplicationContext si necesita acceder a él.

Citado de la referencia del marco web Spring.

Por cierto, el servlet y el contexto raíz son ambos webApplicationContext:

Jerarquía de contexto típica en Spring Web MVC

Nick Allen avatar Sep 13 '2017 13:09 Nick Allen