应用程序上下文和 Web 应用程序上下文有什么区别?
我知道它WebApplicationContext用于面向 Spring MVC 架构的应用程序吗?
WebApplicationContext
我想知道ApplicationContextMVC 应用程序中的用途是什么?中定义了什么样的bean ApplicationContext?
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 之间的区别