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


193

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

WebApplicationContextSpring MVCアーキテクチャ指向のアプリケーションに使用されていることを知っていますか?

ApplicationContextMVCアプリケーションでの使用方法を知りたいのですが?そして、どのような種類の豆が定義されていApplicationContextますか?


5
私はそれがstackoverflow.com/questions/3652090/の複製であるとは思いません… その質問はweb.xmlファイルの内容について尋ねます。この質問はいくつかの春のクラスについて尋ねています。
Raedwald 2013

@Raedwaldそれは真実ではありません。他の質問について話されていないweb.xmlが、それは春のXML Bean構成話しての変異体ApplicationContextWebApplicationContext。内のすべてのBean定義applicationContext.xmlはで利用でき、内のApplicationContextすべてのBean定義*-servlet.xmlはで利用できますWebApplicationContext
g00glen00b 2013

回答:


228

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の違い


2
答えてくれてありがとう。Webアプリケーションでも使用されるコンテキストには2つのタイプがあると聞きました。1つはルートアプリケーションコンテキストとして機能し、Web以外の定義がサンプルサービスやdao構成などで提供されます。もう1つは、ハンドラーマッピングなどのWeb固有の構成用です。前者は親コンテキストとして機能し、後者は子コンテキストとして機能します。この構造の宣言方法を知りたい。いくつかのContextListenerコールバックについて聞いたことがあります。しかし、私はそれについてかなり不明確です。
Sumit Trehan 2012

1
このような構造はSpringサーブレットツールでハードコードされています。SpringWebアプリには常に少なくとも2つのアプリケーションコンテキストがあります。更新された回答を参照してください。
ボリストロイホフ

優れた説明..私はこのシナリオにいくつかの疑いを持っていました..私は初期段階にあるので、いくつかの知識を得るのに役立つ答えを見つけました..
user533

「現在のアプリケーションコンテキストに存在しない場合、必要なBeanは親コンテキストからフェッチされます」。どのように説明できますか?WebアプリケーションコンテキストはどのようにルートアプリケーションコンテキストのBeanにアクセスできますか?例にリンクしますか?
2018年

14

サーブレットの時代に戻ると、web.xmlが持つことができるのは1つだけな<context-param>ので、サーバーがアプリケーションをロードすると、1つのコンテキストオブジェクトのみが作成され、そのコンテキストのデータはすべてのリソース(例:サーブレットとJSP)間で共有されます。これは、コンテキストにデータベースドライバー名があるのと同じで、変更されません。同様に、<contex-param>SpringでcontextConfigLocationパラメータを宣言すると、1つのアプリケーションコンテキストオブジェクトが作成されます。

 <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.myApp.ApplicationContext</param-value>
 </context-param>

アプリケーションには複数のサーブレットを含めることができます。たとえば、/ 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>

13

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

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

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

ちなみに、サーブレットとルートコンテキストはどちらも webApplicationContextです。

Spring Web MVCの典型的なコンテキスト階層


6

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


3

WebApplicationContextインターフェイスで指定されたWebアプリケーションコンテキストはWebアプリケーションの Springアプリケーションコンテキストです。WebApplicationContextインターフェースがインターフェースを拡張し、WebアプリケーションのApplicationContext標準サーブレットAPI ServletContextを取得するためのメソッドを追加する場合、これには通常のSpringアプリケーションコンテキストのすべてのプロパティがあります。

標準のSpring Beanスコープsingletonprototypeに加えて、Webアプリケーションコンテキストでは3つの追加のスコープを使用できます。

  • request-単一のBean定義を単一のHTTPリクエストのライフサイクルにスコープします。つまり、各HTTPリクエストには、単一のBean定義の背後に作成されたBeanの独自のインスタンスがあります。
  • session -単一のBean定義をHTTPセッションのライフサイクルにスコープします
  • application -単一のBean定義のスコープを、 ServletContext
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.