小编典典

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

all

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

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

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


阅读 104

收藏
2022-07-01

共1个答案

小编典典

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

2022-07-01