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


¿Cuál es la diferencia entre el Contexto de la Aplicación y el Contexto de la Aplicación Web?

Soy consciente de que WebApplicationContext se utiliza para aplicaciones orientadas a la arquitectura Spring MVC?

Quiero saber cuál es el uso de ApplicationContext en aplicaciones MVC? ¿Y qué tipo de frijoles se definen en ApplicationContext?

Author: Cœur, 2012-07-29

4 answers

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

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

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 ServletContext, por ejemplo, acceder a recursos WEB-INF(configuraciones xml, etc.) por 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 de 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 deba usar la clase MockServletContext para probar.

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

Esto le permite ejecutar algunos servicios como los singletons para toda la aplicación (Spring Security beans y basic database access services típicamente residen aquí) y otro como servicios separados en el servlets correspondientes para evitar conflictos de nombre entre frijoles. Por ejemplo, un contexto servlet servirá las páginas web y otro implementará un servicio web sin estado.

Esta separación de dos niveles viene de la caja cuando se utilizan las clases de servlet de primavera: para configurar el contexto raíz de la aplicación se debe utilizar context-param etiqueta 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 raíz de la aplicación es creado por ContextLoaderListener que se declara en web.xml

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

) y servlet etiqueta para los contextos de la aplicación 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.

Véase también: Diferencia entre ApplicationContext.xml y spring-servlet.xml en Spring Framework

 207
Author: Boris Treukhov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:06

ApplicationContext ApplicationContext.xml es la configuración de contexto raíz para cada aplicación web. Muelle carga 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 usando el parámetro contextConfigLocation, Spring buscará el ApplicationContext.xml en la carpeta WEB-INF y throw FileNotFoundException si no pudo encontrar este archivo.

WebApplicationContext Aparte de ApplicationContext, puede haber múltiples WebApplicationContext en una sola aplicación web. En palabras simples, cada DispatcherServlet asociado con single WebApplicationContext. xxx-servlet.el archivo 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 scenrios, cada DispatcherServlet tendría un separate xxx-servlet.xml configurado. 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 webapps WEB-INF donde xxx es el nombre del servlet en la web.XML. Si desea cambiar el nombre de ese nombre de archivo o cambiar la ubicación, agregue initi-param con contextConfigLocation como nombre param.

 30
Author: JavaDev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-14 14:19:23

Volviendo a Servlet days, web.xml puede tener solo un <context-param>, por lo que solo se crea un objeto de contexto cuando el servidor carga una aplicación y los datos en ese contexto se comparten entre todos los recursos (por ejemplo: Servlets y JSPs). Es lo mismo que tener el nombre del controlador de base de datos en el contexto, que no cambiará. De manera similar, cuando declaramos contextConfigLocation param en <contex-param> Spring crea un objeto de contexto de aplicación.

 <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.myApp.ApplicationContext</param-value>
 </context-param>

Puede tener varios Servlets en una aplicación. Para ejemplo es posible que desee manejar las solicitudes / secure / * de una manera y / non-seucre / * de otra manera. Para cada uno de estos Servlets puede tener un objeto context, que es un WebApplicationContext.

<servlet>
    <servlet-name>SecureSpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>com.myapp.secure.SecureContext</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>SecureSpringDispatcher</servlet-name>
    <url-pattern>/secure/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>NonSecureSpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>com.myapp.non-secure.NonSecureContext</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>NonSecureSpringDispatcher</servlet-name>
    <url-pattern>/non-secure/*</url-patten>
</servlet-mapping>
 7
Author: Ben Tennyson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-10 19:17:57

La respuesta aceptada es a través, pero hay una explicación oficial sobre esto:

El WebApplicationContext es una extensión del plain ApplicationContext que tiene algunas características adicionales necesarias para las aplicaciones web. Se diferencia de un ApplicationContext normal en que es capaz de resolver temas (véase Usar temas), y que sabe con qué Servlet está asociado (al tener un enlace al ServletContext). El WebApplicationContext está enlazado en el ServletContext, y mediante el uso de métodos estáticos en la clase RequestContextUtils siempre puede buscar el WebApplicationContext si necesita acceso a él.

Citado de Referencia de Spring web framework

Por cierto servlet y contexto raíz son ambos WebApplicationContext:

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

 4
Author: Nick Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-13 13:46:03