コンテキスト階層

DispatcherServlet は、自身の構成に WebApplicationContext (プレーン ApplicationContext の拡張)を期待しています。WebApplicationContext には、関連付けられている ServletContext および Servlet へのリンクがあります。また、ServletContext にバインドされているため、アプリケーションは RequestContextUtils の静的メソッドを使用して、WebApplicationContext にアクセスする必要がある場合に WebApplicationContext を検索できます。

多くのアプリケーションでは、単一の WebApplicationContext を持つことがシンプルで十分です。また、1 つのルート WebApplicationContext が複数の DispatcherServlet (または他の Servlet)インスタンスで共有され、それぞれが子 WebApplicationContext 構成を持つコンテキスト階層を持つことも可能です。コンテキスト階層機能の詳細については ApplicationContext の追加機能を参照してください。

通常、ルート WebApplicationContext には、複数の Servlet インスタンス間で共有する必要があるデータリポジトリやビジネスサービスなどのインフラストラクチャ Bean が含まれています。これらの Bean は事実上継承され、特定の Servlet にローカルな Bean を通常含むサーブレット固有の子 WebApplicationContext でオーバーライド(つまり、再宣言)できます。次の図は、この関連を示しています。

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/*")
	}
}
アプリケーションコンテキスト階層が不要な場合、アプリケーションは getServletConfigClasses() から getRootConfigClasses() および 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 サーブレットパラメーターを空のままにすることができます。