ApplicationContext和WebApplicationContext在Spring MVC中有什么区别?

可能重复:
applicationContext和spring-servlet.xml在spring中的区别

应用程序上下文和Web应用程序上下文有什么区别?

我知道WebApplicationContext用于面向Spring MVC架构的应用程序吗?

我想知道在MVC应用ApplicationContext中使用ApplicationContext是什么? 在ApplicationContext中定义了什么样的bean?

Web应用程序上下文扩展应用程序上下文,该应用程序上下文旨在与标准的javax.servlet.ServletContext一起工作,以便能够与容器进行通信。

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

在WebApplicationContext中实例化的Bean如果实现ServletContextAware接口,也将能够使用ServletContext

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

使用ServletContext实例可能有许多事情,例如通过调用getResourceAsStream()方法来访问WEB-INF资源(xml configs等)。 通常,在servlet Spring应用程序的web.xml中定义的所有应用程序上下文都是Web应用程序上下文,这既适用于根web应用程序上下文,也适用于servlet的应用程序上下文。

此外,根据Web应用程序的上下文能力,可能会使您的应用程序更难以testing,您可能需要使用MockServletContext类进行testing。

Servlet和根上下文之间的区别 Spring允许您构build多级应用程序上下文的层次结构,因此如果当前应用程序上下文中不存在所需的bean,将从父上下文中获取。 在web应用程序中,默认情况下有两个层次结构:root和servlet上下文: Servlet和根上下文

这允许您以整个应用程序(Spring Security bean和基本数据库访问服务通常驻留在此处)的单例身份运行一些服务,另一个服务作为相应servlet中的分离服务,以避免bean之间的名称冲突。 例如,一个servlet上下文将服务于网页,另一个将实现无状态的web服务。

当您使用spring servlet类时,这两个级别的分离就出来了:要configuration根应用程序上下文,您应该在web.xml中使用context-param标记

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

(根应用程序上下文由在web.xml中声明的ContextLoaderListener创build

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

)和servlet标签的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> 

请注意,如果init-param被省略,那么spring将在这个例子中使用myservlet-servlet.xml。

另请参见: Spring Framework中applicationContext.xml和spring-servlet.xml的区别

ApplicationContext applicationContext.xml是每个Web应用程序的根上下文configuration。 Spring加载applicationContext.xml文件并为整个应用程序创buildApplicationContext。 每个Web应用程序只有一个应用程序上下文。 如果您没有使用contextConfigLocation参数在web.xml中显式声明上下文configuration文件名,则Spring将searchWEB-INF文件夹下的applicationContext.xml,如果找不到该文件,则抛出FileNotFoundException。

WebApplicationContext除了ApplicationContext,在单个Web应用程序中可以有多个WebApplicationContext。 简而言之,每个DispatcherServlet都与单个WebApplicationContext关联。 xxx-servlet.xml文件特定于DispatcherServlet,Web应用程序可以configuration多个DispatcherServlet来处理请求。 在这种情况下,每个DispatcherServlet都会configuration一个单独的xxx-servlet.xml。 但是,applicationContext.xml对于所有的servletconfiguration文件都是通用的。 Spring将默认从您的webapps WEB-INF文件夹加载名为“xxx-servlet.xml”的文件,其中xxx是web.xml中的servlet名称。 如果要更改该文件名的名称或更改位置,请将contextConfigLocation作为参数名添加起始参数。

回到Servlet日子,web.xml只能有一个<context-param> ,所以当服务器加载一个应用程序时,只有一个上下文对象被创build,并且这个上下文中的数据被所有资源共享(例如:Servlets和JSP)。 它与上下文中的数据库驱动程序名称相同,不会更改。 以类似的方式,当我们在<contex-param>声明contextConfigLocation参数时,Spring创build一个Application Context对象。

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

您可以在应用程序中拥有多个Servlet。 例如,您可能想要以某种方式处理/ secure / *请求,而以其他方式处理/ non-seucre / *。 对于这些Servlet中的每一个,都可以有一个上下文对象,它是一个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> 

被接受的答案是通过,但有这方面的官方解释:

WebApplicationContext是普通ApplicationContext的扩展,它具有Web应用程序所需的一些额外function。 它不同于普通的ApplicationContext,因为它能够parsing主题(请参阅使用主题),并知道与哪个Servlet关联(通过链接到ServletContext)。 WebApplicationContext绑定在ServletContext中,并且通过在RequestContextUtils类上使用静态方法,您可以随时查找WebApplicationContext(如果需要访问它)。

引用Spring Web框架参考

顺便说一句,servlet和根上下文都是webApplicationContext:

Spring Web MVC中典型的上下文层次结构