アプリケーションコンテキストとWebアプリケーションコンテキストの違いは何ですか?
私はWebApplicationContext
がSpring MVCアーキテクチャ指向のアプリケーションに使われていることを知っていますか?
MVCアプリケーションでApplicationContext
を使用する方法を知りたいですか。 ApplicationContext
にはどのような種類のBeanが定義されていますか?
Webアプリケーションコンテキストは、標準の javax.servlet.ServletContext で動作するように設計されたApplication Contextを拡張したもので、コンテナと通信できます。
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);
}
ServletContextインスタンスでできることはたくさんあります。たとえば、getResourceAsStream()メソッドを呼び出してWEB-INFリソース(xml configなど)にアクセスすることです。通常、サーブレットSpringアプリケーションのweb.xmlで定義されているすべてのアプリケーションコンテキストはWebアプリケーションコンテキストです。これはルートWebアプリケーションコンテキストとサーブレットのアプリケーションコンテキストの両方に適用されます。
また、Webアプリケーションのコンテキスト機能によっては、アプリケーションのテストが少々困難になる場合があります。テストには MockServletContext クラスを使用する必要があります。
サーブレットとルートコンテキストの違いSpringではマルチレベルのアプリケーションコンテキスト階層を構築できるので、必要なBeanが親コンテキストに存在しない場合はそれを取得します。現在のアプリケーションコンテキストWebアプリケーションには、デフォルトで、ルートコンテキストとサーブレットコンテキストの2つの階層レベルがあります。 。
これにより、一部のサービスをアプリケーション全体のシングルトンとして実行し(Spring Security Beanと基本的なデータベースアクセスサービスは通常ここにあります)、別のサービスを対応するサーブレット内の個別のサービスとして実行してBean間の名前の衝突を回避できます。たとえば、あるサーブレットコンテキストがWebページを処理し、別のサーブレットコンテキストがステートレスWebサービスを実装します。
Springサーブレットクラスを使用する場合、この2つのレベルの分離はすぐに使用できます。ルートアプリケーションコンテキストを設定するには、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は<context-param>
を1つだけ持つことができるので、サーバーがアプリケーションをロードしたときに作成されるコンテキストオブジェクトは1つだけであり、そのコンテキスト内のデータはすべてのリソースで共有されます(例:サーブレットとJSP)。コンテキスト内にデータベースドライバ名があるのと同じですが、変更されません。同様に、<contex-param>
でcontextConfigLocationパラメータを宣言すると、Springは1つのApplication Contextオブジェクトを作成します。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.myApp.ApplicationContext</param-value>
</context-param>
1つのアプリケーションに複数のサーブレットを含めることができます。たとえば、/ secure/*要求を一方の方法で処理し、/ non-seucre/*を別の方法で処理するとします。これらの各サーブレットに対して、WebApplicationContextというコンテキストオブジェクトを設定できます。
<servlet>
<servlet-name>SecureSpringDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>com.myapp.secure.SecureContext</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SecureSpringDispatcher</servlet-name>
<url-pattern>/secure/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>NonSecureSpringDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>com.myapp.non-secure.NonSecureContext</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>NonSecureSpringDispatcher</servlet-name>
<url-pattern>/non-secure/*</url-patten>
</servlet-mapping>
受け入れられた答えはありますが、これに関する公式の説明があります。
WebApplicationContextはプレーンなApplicationContextの拡張であり、Webアプリケーションに必要ないくつかの追加機能があります。通常のApplicationContextとは異なり、テーマを解決することができ(「テーマの使用」を参照)、関連付けられているサーブレットが(ServletContextへのリンクを持つことで)認識されます。 WebApplicationContextはServletContextにバインドされており、RequestContextUtilsクラスの静的メソッドを使用することで、アクセスする必要がある場合はいつでもWebApplicationContextをルックアップできます。
から引用しました Spring Webフレームワークリファレンス
ところで、サーブレットとルートコンテキストは両方webApplicationContextです。
ApplicationContext(ルートアプリケーションコンテキスト):すべてのSpring MVC Webアプリケーションには、コンテキスト設定のルートとして設定されるapplicationContext.xmlファイルがあります。 Springはこのファイルをロードし、アプリケーション全体のapplicationContextを作成します。このファイルは、web.xmlファイルでコンテキストパラメーターとして設定されているContextLoaderListenerによってロードされます。また、Webアプリケーションごとに1つのapplicationContextのみが存在します。
WebApplicationContext:WebApplicationContextはWeb対応のアプリケーションコンテキストです。つまり、サーブレットコンテキスト情報を持っています。単一のWebアプリケーションは複数のWebApplicationContextを持つことができ、各Dispatcherサーブレット(Spring MVCアーキテクチャのフロントコントローラー)はWebApplicationContextに関連付けられます。 webApplicationContext構成ファイル* -servlet.xmlは、DispatcherServletに固有です。また、Webアプリケーションには複数の要求を処理するように構成された複数のディスパッチャサーブレットを含めることができるため、Webアプリケーションごとに複数のwebApplicationContextファイルが存在する可能性があります。
WebApplicationContext
インターフェイスで指定されたWebアプリケーションコンテキストは、WebアプリケーションのSpringアプリケーションコンテキストです。 WebApplicationContext
インターフェースがApplicationContext
インターフェースを拡張し、Webアプリケーション用の標準サーブレットAPI ServletContext
を取得するメソッドを追加する場合、通常のSpringアプリケーションコンテキストのすべてのプロパティがあります。
標準のSpring Beanスコープsingleton
およびprototype
に加えて、Webアプリケーションコンテキストで使用可能な3つの追加スコープがあります。
request
-単一のBean定義を単一のHTTP要求のライフサイクルにスコープします。つまり、各HTTP要求には、単一のBean定義の背後から作成されたBeanの独自のインスタンスがありますsession
-単一のBean定義をHTTPセッションのライフサイクルにスコープしますapplication
-単一のBean定義をServletContext
のライフサイクルにスコープします