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>
(根应用上下文由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