Webアプリケーションコンテキストは、標準のjavax.servlet.ServletContextと連携してコンテナと通信できるように設計された拡張アプリケーションコンテキストです。
public interface WebApplicationContext extends ApplicationContext {
ServletContext getServletContext();
}
WebApplicationContextでインスタンス化されたBeanは、ServletContextAwareインターフェースを実装していれば、ServletContextを使用することもできます。
package org.springframework.web.context;
public interface ServletContextAware extends Aware {
void setServletContext(ServletContext servletContext);
}
たとえば、getResourceAsStream()メソッドを呼び出してWEB-INFリソース(xml configsなど)にアクセスするなど、ServletContextインスタンスで実行できることはたくさんあります。通常、サーブレットSpringアプリケーションのweb.xmlで定義されているすべてのアプリケーションコンテキストは、Webアプリケーションコンテキストです。これは、ルートwebappコンテキストとサーブレットのアプリコンテキストの両方に適用されます。
また、Webアプリケーションのコンテキスト機能によっては、アプリケーションのテストが少し難しくなる場合があり、テストにはMockServletContextクラスを使用する必要がある場合があります。
サーブレットとルートコンテキストの違い
Springでは、マルチレベルのアプリケーションコンテキスト階層を構築できるため、必要なBeanが現在のアプリケーションコンテキストに存在しない場合は、親コンテキストからフェッチされます。デフォルトのWebアプリには、ルートコンテキストとサーブレットコンテキストの2つの階層レベルがあります。
これにより、一部のサービスをアプリケーション全体のシングルトンとして実行でき(Spring Security Beanと基本的なデータベースアクセスサービスは通常ここに常駐します)、別のサービスとして対応するサーブレットで実行して、Bean間の名前の衝突を回避できます。たとえば、1つのサーブレットコンテキストがWebページを提供し、別のコンテキストがステートレスWebサービスを実装します。
この2つのレベルの分離は、Springサーブレットクラスを使用するとすぐに利用できます。ルートアプリケーションコンテキストを構成するには、web.xmlでcontext-paramタグを使用する必要があります
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/root-context.xml
/WEB-INF/applicationContext-security.xml
</param-value>
</context-param>
(ルートアプリケーションコンテキストは、web.xmlで宣言されているContextLoaderListenerによって作成されます。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
)およびサーブレットアプリケーションコンテキストのサーブレットタグ
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>app-servlet.xml</param-value>
</init-param>
</servlet>
init-paramが省略される場合、この例ではSpringがmyservlet-servlet.xmlを使用することに注意してください。
参照:Spring FrameworkでのapplicationContext.xmlとspring-servlet.xmlの違い
web.xml
ファイルの内容について尋ねます。この質問はいくつかの春のクラスについて尋ねています。