framework - ¿Cuál es la diferencia entre ApplicationContext y WebApplicationContext en Spring MVC?
spring mvc 4 tutorial español (4)
Posible duplicado:
diferencia entre applicationContext y spring-servlet.xml en primavera
¿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 usa para las aplicaciones orientadas a la arquitectura Spring MVC?
Quiero saber de qué sirve ApplicationContext
en las aplicaciones MVC? ¿Y qué tipo de beans están definidos en ApplicationContext
?
Contexto de aplicación extendido contexto de aplicación web 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 posibles que hacer con la instancia de ServletContext, por ejemplo, accediendo a los recursos de WEB-INF (configuraciones xml y etc.) llamando al método getResourceAsStream (). Por lo general, todos los contextos de aplicación definidos en web.xml en una aplicación de servlet Spring son contextos de aplicación web, esto va tanto al contexto de la aplicación raíz como al contexto de la aplicación del servlet.
Además, dependiendo de las capacidades de contexto de la aplicación web, su aplicación puede ser un poco más difícil de probar, y es posible que deba utilizar la clase MockServletContext para realizar pruebas.
Diferencia entre el contexto de servlet y raíz Spring le permite construir jerarquías de contexto de aplicación multinivel, de modo que el bean requerido se recuperará desde el contexto primario si no está presente en el contexto de la aplicación actual. En las aplicaciones web, como predeterminado, hay dos niveles de jerarquía, contextos raíz y de servlet: .
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 la base de datos normalmente residen aquí) y otro como servicios separados en los servlets correspondientes para evitar conflictos de nombres entre los beans. Por ejemplo, un contexto servlet servirá a las páginas web y otro implementará un servicio web sin estado.
Esta separación de dos niveles surge de la caja cuando utiliza 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>
( ContextLoaderListener crea el contexto de la aplicación raíz 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 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, entonces spring usará myservlet-servlet.xml en este ejemplo.
Ver también: Diferencia entre applicationContext.xml y spring-servlet.xml en Spring Framework
La respuesta aceptada ha terminado, 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. Difiere de un ApplicationContext normal en que es capaz de resolver temas (ver Uso de temas), y que sabe con qué Servlet está asociado (al tener un enlace al ServletContext). WebApplicationContext está enlazado en ServletContext y, al usar métodos estáticos en la clase RequestContextUtils, siempre puede buscar WebApplicationContext si necesita acceder a él.
Citado de Spring web framework reference
Por cierto, el contexto de servlet y raíz son ambos webApplicationContext:
Volviendo a los días de Servlet, web.xml solo puede tener 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 (Ej: Servlets y JSP). Es lo mismo que tener el nombre del controlador de la 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 múltiples servlets en una aplicación. Por ejemplo, es posible que desee gestionar las solicitudes / secure / * de una forma y / non-seucre / * de otra manera. Para cada uno de estos Servlets puede tener un objeto de contexto, 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>
ApplicationContext applicationContext.xml es la configuración de contexto raíz para cada aplicación web. Spring carga el archivo applicationContext.xml y crea 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 de archivo de configuración de contexto en web.xml usando el param contextConfigLocation, Spring buscará el archivo applicationContext.xml en la carpeta WEB-INF y arrojará FileNotFoundException si no pudo encontrar este archivo.
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. 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 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.