跳到主要内容
版本:6.2.3

上下文层级

ChatGPT-4o-mini 中英对照 Context Hierarchy

DispatcherServlet 期望一个 WebApplicationContext(一个普通 ApplicationContext 的扩展)用于其自身的配置。WebApplicationContext 与其关联的 ServletContext 和 Servlet 有一个链接。它还绑定到 ServletContext,这样应用程序可以使用 RequestContextUtils 上的静态方法查找 WebApplicationContext,如果它们需要访问它。

对于许多应用程序,拥有一个单一的 WebApplicationContext 是简单且足够的。也可以拥有一个上下文层次结构,其中一个根 WebApplicationContext 在多个 DispatcherServlet(或其他 Servlet)实例之间共享,每个实例都有自己独立的子 WebApplicationContext 配置。有关上下文层次结构特性的更多信息,请参见 ApplicationContext 的附加功能。

根 WebApplicationContext 通常包含基础设施 bean,例如需要在多个 Servlet 实例之间共享的数据存储库和业务服务。这些 bean 实际上是被继承的,并且可以在特定于 Servlet 的子 WebApplicationContext 中被重写(即重新声明),该子上下文通常包含与给定 Servlet 相关的本地 bean。下图展示了这种关系:

mvc context hierarchy

以下示例配置了一个 WebApplicationContext 层次结构:

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { RootConfig.class };
}

@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { App1Config.class };
}

@Override
protected String[] getServletMappings() {
return new String[] { "/app1/*" };
}
}
提示

如果不需要应用程序上下文层次结构,应用程序可以通过 getRootConfigClasses() 返回所有配置,并从 getServletConfigClasses() 返回 null。

以下示例显示了 web.xml 的等效内容:

<web-app>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/root-context.xml</param-value>
</context-param>

<servlet>
<servlet-name>app1</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app1-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>app1</servlet-name>
<url-pattern>/app1/*</url-pattern>
</servlet-mapping>

</web-app>
提示

如果不需要应用程序上下文层次结构,应用程序可以仅配置一个“根”上下文,并将 contextConfigLocation Servlet 参数留空。