203

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

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

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

4

5 回答 5

235

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 应用程序上下文,这既涉及根 webapp 上下文,也涉及 servlet 的应用程序上下文。

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

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

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

) 和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 之间的区别

于 2012-07-29T12:35:00.827 回答
19

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

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

引用自Spring Web 框架参考

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

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

于 2017-09-13T13:46:03.917 回答
16

回到 Servlet 时代,web.xml 只能有一个<context-param>,因此当服务器加载应用程序时只会创建一个上下文对象,并且该上下文中的数据在所有资源之间共享(例如:Servlet 和 JSP)。这与在上下文中具有数据库驱动程序名称相同,不会更改。类似地,当我们在 Spring 中声明 contextConfigLocation 参数时,<contex-param>会创建一个 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>
于 2017-03-16T16:08:42.533 回答
10

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

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

于 2019-02-06T04:40:14.080 回答
4

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

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

  • request- 将单个 bean 定义限定为单个 HTTP 请求的生命周期;也就是说,每个 HTTP 请求都有自己的 bean 实例,该实例是在单个 bean 定义的后面创建的
  • session- 将单个 bean 定义范围限定为 HTTP 会话的生命周期
  • application- 将单个 bean 定义范围限定为 a 的生命周期ServletContext
于 2019-08-12T11:20:46.470 回答