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

时间:2012-07-29 11:44:12

标签: spring spring-mvc applicationcontext

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

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

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

5 个答案:

答案 0 :(得分:217)

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

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

在WebApplicationContext中实例化的Beans如果实现了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应用程序上下文,这既适用于根webapp上下文,也适用于servlet的应用程序上下文。

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

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

这允许您作为整个应用程序的单例运行一些服务(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>

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

<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。

另请参阅:Difference between applicationContext.xml and spring-servlet.xml in Spring Framework

答案 1 :(得分:9)

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

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

您可以在应用程序中拥有多个Servlet。例如,您可能希望以一种方式处理/ secure / *请求,而以其他方式处理/非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>

答案 2 :(得分:9)

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

  

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

     

引自Spring web framework reference

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

Typical context hierarchy in Spring Web MVC

答案 3 :(得分:3)

WebApplicationContext界面指定的

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

除了标准的Spring bean作用域singletonprototype之外,Web应用程序上下文还提供了三个附加作用域:

  • request-将单个bean定义的范围限定为单个HTTP请求的生命周期;也就是说,每个HTTP请求都有一个在单个bean定义后面创建的bean实例
  • session-将单个bean定义的范围限定为HTTP会话的生命周期
  • application-将单个bean定义的范围限定为ServletContext的生命周期

答案 4 :(得分:2)

ApplicationContext(根应用程序上下文): 每个Spring MVC Web应用程序都有一个applicationContext.xml文件,该文件配置为上下文配置的根。 Spring加载此文件并为整个应用程序创建一个applicationContext。 该文件由ContextLoaderListener加载,该文件在web.xml文件中配置为上下文参数。每个Web应用程序只有一个applicationContext。

WebApplicationContext: WebApplicationContext是一个可感知网络的应用程序上下文,即它具有servlet上下文信息。 一个Web应用程序可以具有多个WebApplicationContext,并且每个Dispatcher Servlet(它是Spring MVC体系结构的前端控制器)都与一个WebApplicationContext相关联。 webApplicationContext配置文件* -servlet.xml特定于DispatcherServlet。 而且,由于一个Web应用程序可以将多个调度程序servlet配置为服务多个请求,因此每个Web应用程序可以有多个webApplicationContext文件。