对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

上下文层次结构

DispatcherServlet 需要一个 WebApplicationContext(普通 ApplicationContext 的扩展)来进行其自身的配置。WebApplicationContext 包含指向与其关联的 ServletContextServlet 的链接。它还绑定到 ServletContext,以便应用程序可以使用 RequestContextUtils 上的静态方法来查找 WebApplicationContext(如果需要访问它)。spring-doc.cadn.net.cn

对于许多应用程序而言,拥有一个单一的 WebApplicationContext 既简单又足够。 也可以构建上下文层次结构,其中一个根 WebApplicationContext 被多个 DispatcherServlet(或其他 Servlet)实例共享,而每个实例都拥有自己的子 WebApplicationContext 配置。 请参阅 ApplicationContext 的其他功能 以了解更多关于上下文层次结构的信息。spring-doc.cadn.net.cn

WebApplicationContext 通常包含基础设施 Bean,例如需要在多个 Servlet 实例之间共享的数据仓库和业务服务。这些 Bean 会被有效继承,并可以在特定于 Servlet 的子 WebApplicationContext 中被覆盖(即重新声明),而该子上下文通常包含特定于给定 Servlet 的本地 Bean。 下图展示了这种关系:spring-doc.cadn.net.cn

mvc context hierarchy

以下示例配置了一个 WebApplicationContext 层级结构:spring-doc.cadn.net.cn

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/*" };
	}
}
class MyWebAppInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {

	override fun getRootConfigClasses(): Array<Class<*>> {
		return arrayOf(RootConfig::class.java)
	}

	override fun getServletConfigClasses(): Array<Class<*>> {
		return arrayOf(App1Config::class.java)
	}

	override fun getServletMappings(): Array<String> {
		return arrayOf("/app1/*")
	}
}
如果不需要应用程序上下文层次结构,应用程序可以通过 getRootConfigClasses() 返回所有配置,并从 null 返回 getServletConfigClasses()

以下示例展示了等效的 web.xml 配置:spring-doc.cadn.net.cn

<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 参数留空。