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

应用程序上下文和Web应用程序上下文之间的区别是什么?

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

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

164637 次浏览

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配置等)。 通常,servlet Spring应用程序中定义在Web .xml中的所有应用程序上下文都是Web应用程序上下文,这既涉及到根Web应用程序上下文,也涉及到servlet的应用程序上下文

另外,依赖于web应用程序上下文功能可能会使你的应用程序更难测试,你可能需要使用MockServletContext类进行测试。

servlet和根上下文的区别 Spring允许您构建多层应用程序上下文层次结构,因此如果所需的bean不在当前应用程序上下文中,则将从父上下文中获取。在web应用程序中,默认有两个层次结构,根上下文和servlet上下文: servlet和根上下文。< / p >

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

当你使用spring servlet类时,这种两级分离就是开箱即用的:要配置根应用程序上下文,你应该在你的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创建

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
< p >) 和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的区别

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

 <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应用程序所必需的额外特性。它与普通的ApplicationContext的不同之处在于它能够解析主题(参见使用主题),并且它知道它与哪个Servlet相关联(通过具有到ServletContext的链接)。WebApplicationContext被绑定在ServletContext中,通过使用RequestContextUtils类上的静态方法,如果你需要访问WebApplicationContext,你总是可以查找到它。

引自Spring web框架参考

顺便说一下,servlet和根上下文是这两个 webApplicationContext:

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

ApplicationContext(根应用程序上下文): 每个Spring MVC web应用程序都有一个applicationContext.xml文件,该文件被配置为上下文配置的根文件。Spring加载这个文件并为整个应用程序创建一个applicationContext。 该文件由ContextLoaderListener加载,它被配置为web.xml文件中的上下文参数。并且每个web应用程序只有一个applicationContext < p > WebApplicationContext: WebApplicationContext是一个web感知的应用程序上下文,即它有servlet上下文信息。 单个web应用程序可以有多个WebApplicationContext,每个Dispatcher servlet (Spring MVC架构的前端控制器)都与一个WebApplicationContext相关联。webApplicationContext配置文件*-servlet.xml是特定于DispatcherServlet的。 由于一个web应用程序可以有多个dispatcher servlet来服务多个请求,所以每个web应用程序可以有多个webApplicationContext文件

Web应用程序上下文WebApplicationContext接口指定,是web应用程序的Spring应用程序上下文。它具有常规Spring应用程序上下文的所有属性,假定WebApplicationContext接口扩展了ApplicationContext接口,并为web应用程序添加了检索标准Servlet API ServletContext的方法。

除了标准Spring bean作用域singletonprototype之外,在web应用程序上下文中还有三个额外的作用域可用:

  • request -将单个bean定义作用于单个HTTP请求的生命周期;也就是说,每个HTTP请求都有自己的bean实例,该实例是在单个bean定义的基础上创建的
  • session -将单个bean定义作用于HTTP会话的生命周期
  • application -将单个bean定义作用于ServletContext的生命周期