web-dev-qa-db-ja.com

Spring MVCのApplicationContextとWebApplicationContextの違いは何ですか?

アプリケーションコンテキストとWebアプリケーションコンテキストの違いは何ですか?

私はWebApplicationContextがSpring MVCアーキテクチャ指向のアプリケーションに使われていることを知っていますか?

MVCアプリケーションでApplicationContextを使用する方法を知りたいですか。 ApplicationContextにはどのような種類のBeanが定義されていますか?

169
Sumit Trehan

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つの階層レベルがあります。 Servlet and root context

これにより、一部のサービスをアプリケーション全体のシングルトンとして実行し(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の違い

217
Boris Treukhov

サーブレットの時代に戻ると、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>
10
Ben Tennyson

受け入れられた答えはありますが、これに関する公式の説明があります。

WebApplicationContextはプレーンなApplicationContextの拡張であり、Webアプリケーションに必要ないくつかの追加機能があります。通常のApplicationContextとは異なり、テーマを解決することができ(「テーマの使用」を参照)、関連付けられているサーブレットが(ServletContextへのリンクを持つことで)認識されます。 WebApplicationContextはServletContextにバインドされており、RequestContextUtilsクラスの静的メソッドを使用することで、アクセスする必要がある場合はいつでもWebApplicationContextをルックアップできます。

から引用しました Spring Webフレームワークリファレンス

ところで、サーブレットとルートコンテキストは両方webApplicationContextです。

Typical context hierarchy in Spring Web MVC

9
Nick Allen

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ファイルが存在する可能性があります。

2
Hetal Rachh

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のライフサイクルにスコープします
0
DimaSan