应用程序上下文和 Web 应用程序上下文有什么区别?
我知道它WebApplicationContext
用于面向 Spring MVC 架构的应用程序吗?
我想知道ApplicationContext
MVC 应用程序中的用途是什么?中定义了什么样的bean ApplicationContext
?
应用程序上下文和 Web 应用程序上下文有什么区别?
我知道它WebApplicationContext
用于面向 Spring MVC 架构的应用程序吗?
我想知道ApplicationContext
MVC 应用程序中的用途是什么?中定义了什么样的bean ApplicationContext
?
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 上下文:.
这允许您将一些服务作为整个应用程序的单例运行(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 之间的区别
接受的答案是通过,但对此有官方解释:
WebApplicationContext 是普通 ApplicationContext 的扩展,它具有 Web 应用程序所需的一些额外功能。它与普通的 ApplicationContext 不同之处在于它能够解析主题(请参阅使用主题),并且它知道它与哪个 Servlet 相关联(通过链接到 ServletContext)。WebApplicationContext 绑定在 ServletContext 中,并且通过在 RequestContextUtils 类上使用静态方法,如果需要访问它,您可以随时查找 WebApplicationContext。
顺便说一句,servlet 和根上下文都是webApplicationContext:
回到 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>
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 文件。
由接口指定的Web 应用WebApplicationContext
程序上下文是 Web 应用程序的 Spring 应用程序上下文。它具有常规 Spring 应用程序上下文的所有属性,假设WebApplicationContext
接口扩展了ApplicationContext
接口,并添加了一个用于检索ServletContext
Web 应用程序的标准 Servlet API 的方法。
除了标准 Spring bean 作用域singleton
和prototype
之外,Web 应用程序上下文中还有另外三个可用作用域:
request
- 将单个 bean 定义限定为单个 HTTP 请求的生命周期;也就是说,每个 HTTP 请求都有自己的 bean 实例,该实例是在单个 bean 定义的后面创建的session
- 将单个 bean 定义范围限定为 HTTP 会话的生命周期application
- 将单个 bean 定义范围限定为 a 的生命周期ServletContext