跳到主要内容

上下文层级

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

DispatcherServlet 期望一个 WebApplicationContext(一个普通 ApplicationContext 的扩展)用于其自身的配置。WebApplicationContext 与其关联的 ServletContextServlet 有一个链接。它还绑定到 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/*" };
}
}
java
提示

如果不需要应用程序上下文层次结构,应用程序可以通过 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>
xml
提示

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