上下文層次結構

DispatcherServlet 期望使用一個 WebApplicationContext (它是普通 ApplicationContext 的擴充套件) 用於其自身的配置。WebApplicationContext 與其關聯的 ServletContextServlet 相關聯。它也繫結到 ServletContext,這樣應用如果需要訪問 WebApplicationContext,就可以使用 RequestContextUtils 上的靜態方法查詢它。

對於許多應用來說,單個 WebApplicationContext 簡單且足夠。也可以有一個上下文層次結構,其中一個根 WebApplicationContext 在多個 DispatcherServlet (或其他 Servlet) 例項之間共享,每個例項都有其自己的子 WebApplicationContext 配置。有關上下文層次結構特性的更多資訊,請參閱ApplicationContext 的附加能力

WebApplicationContext 通常包含需要在多個 Servlet 例項之間共享的基礎設施 bean,例如資料倉庫和業務服務。這些 bean 實際上是繼承的,並且可以在 Servlet 特定的子 WebApplicationContext 中被覆蓋(即重新宣告),子上下文通常包含給定 Servlet 本地的 bean。下圖顯示了這種關係

mvc context hierarchy

以下示例配置了一個 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/*")
	}
}
如果不需要應用上下文層次結構,應用可以透過 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 引數為空。