上下文层次结构
DispatcherServlet
期望为其自身配置提供一个 WebApplicationContext
(ApplicationContext
的扩展)。WebApplicationContext
链接到 ServletContext
以及与其关联的 Servlet
。它还绑定到 ServletContext
,这样应用程序就可以使用 RequestContextUtils
上的静态方法来查找 WebApplicationContext
,如果它们需要访问它的话。
对于许多应用程序来说,拥有一个单独的 WebApplicationContext
既简单又足够。
也可以拥有一个上下文层次结构,其中一个根 WebApplicationContext
在多个 DispatcherServlet
(或其他 Servlet
)实例之间共享,每个实例都有
自己的子 WebApplicationContext
配置。
有关上下文层次结构功能的更多信息,请参阅 ApplicationContext
的附加功能。
根 WebApplicationContext
通常包含基础设施 bean,例如需要在多个 Servlet
实例之间共享的数据仓库和业务服务。这些 bean 被有效地继承,并且可以在 Servlet 特定的子 WebApplicationContext
中被覆盖(即重新声明),子 WebApplicationContext
通常包含给定 Servlet
本地的 bean。下图显示了这种关系:

以下示例配置了一个 WebApplicationContext
层次结构:
-
Java
-
Kotlin
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/*")
}
}
如果不需要应用程序上下文层次结构,应用程序可以通过 |
以下示例显示了等效的 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>
如果不需要应用程序上下文层次结构,应用程序可以只配置一个“ |