基本的に、ContextLoaderListner を使用してルート アプリケーション コンテキストと Web アプリケーション コンテキストを分離できます。
context param でマップされた構成ファイルは、ルート アプリケーションのコンテキスト構成として動作します。また、ディスパッチャー サーブレットにマップされた構成ファイルは、Web アプリケーション コンテキストのように動作します。
どの Web アプリケーションでも、複数のディスパッチャー サーブレットが存在する場合があるため、複数の Web アプリケーション コンテキストが存在します。
しかし、どの Web アプリケーションでも、すべての Web アプリケーション コンテキストと共有されるルート アプリケーション コンテキストが 1 つしかない場合があります。
ルート アプリケーション コンテキストで共通のサービス、エンティティ、アスペクトなどを定義する必要があります。また、コントローラー、インターセプターなどは、関連する Web アプリケーション コンテキストにあります。
サンプルの web.xml は次のとおりです。
<!-- language: xml -->
<web-app>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>example.config.AppConfig</param-value>
</context-param>
<servlet>
<servlet-name>restEntryPoint</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>example.config.RestConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>restEntryPoint</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>webEntryPoint</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>example.config.WebConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>webEntryPoint</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
ここで構成クラス example.config.AppConfig を使用して、他のすべての Web アプリケーション コンテキストと共有されるルート アプリケーション コンテキストでサービス、エンティティ、アスペクトなどを構成できます (たとえば、ここでは 2 つの Web アプリケーション コンテキスト構成クラス RestConfig と WebConfig があります)。
PS: ここで ContextLoaderListener は完全にオプションです。ここで web.xml に ContextLoaderListener を記述しないと、AppConfig が機能しません。その場合、WebConfig と Rest Config ですべてのサービスとエンティティを構成する必要があります。