Spring FrameworkのapplicationContext.xmlとspring-servlet.xmlの違い


373
  • あるapplicationContext.xmlspring-servlet.xml春Frameworkでとにかく関連?
  • で宣言されたプロパティファイルはapplicationContext.xml利用できますDispatcherServletか?
  • 関連するメモで、なぜ私*-servlet.xmlはまったく必要なのですか?なぜapplicationContext.xml一人では不十分ですか?

1
こちらもご覧ください。stackoverflow.com/questions/11708967/...
Sanghyunリー

回答:


430

Springでは、親子階層で複数のコンテキストを定義できます。

applicationContext.xmlつまり、Webアプリケーションに関連付けられているコンテキスト、「ルートWebアプリケーションのコンテキスト」のための豆を定義します。

spring-servlet.xml(または任意の他、あなたがそれを呼び出す)1つのサーブレットのアプリケーションコンテキストの豆を定義します。これらの多くは、Springサーブレットごとに1つ(例:spring1-servlet.xmlサーブレットspring1spring2-servlet.xmlサーブレットspring2)のWebアプリケーションに存在できます。

のBeanはのBeanをspring-servlet.xml参照できますapplicationContext.xmlが、その逆はできません。

すべてのSpring MVCコントローラーはspring-servlet.xmlコンテキスト内で実行する必要があります。

ほとんどの単純なケースでは、applicationContext.xmlコンテキストは不要です。通常は、Webアプリケーションのすべてのサーブレット間で共有されるBeanを含めるために使用されます。サーブレットが1つしかない場合は、特別な用途がない限り、あまり意味がありません。


30
なぜ複数のSpringサーブレットがあるのですか?
NimChimpsky 2012

5
強力な強力な答え(簡潔さのため)
両生類

35
@NimChimpsky場合によっては、同じコンテキストで競合する可能性のあるアプリケーションの部分を分離すると便利なことがあります。例として、ReSTサービスと標準ビューがある場合、ビューに関するさまざまなビューリゾルバーまたはサービスのセキュリティ上の懸念がある場合があります。
ブレット・ライアン

12
ドキュメントを読んだり、アプリを開発したりする前に、この答えを見てください。通常の場合、ContextLoaderListenerとcontextConfigLocationはまったく必要ありません。DispatcherServletだけが必要です。
ruruskyi 2013年

24
多くのチュートリアルでは、contextConfigLocationには、dispatcher-servlet.xmlおよびDispatcherServletが含まれています。これにより、Beanが2回初期化されます。
ruruskyi 2013年

106

シナリオ1

クライアントアプリケーション内(アプリケーションはWebアプリケーションではない。たとえば、swingアプリである可能性がある)

private static ApplicationContext context = new  ClassPathXmlApplicationContext("test-client.xml");

context.getBean(name);

web.xmlは必要ありません。Beanサービスを取得するためのコンテナとしてのApplicationContext。Webサーバーコンテナーは必要ありません。でテストclient.xmlのないリモートシンプルな豆、リモーティングと豆が存在し得ます。

結論:シナリオ1では、applicationContextとDispatcherServlet関連していません。

シナリオ2

サーバーアプリケーション(Tomcatなどのサーバーにデプロイされたアプリケーション)。クライアントプログラム(例:Swingアプリ)からのリモート処理を介したサービスへのアクセス

web.xmlでリスナーを定義する

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

サーバーの起動時にContextLoaderListenerapplicationContext.xmlで定義されたBeanをインスタンス化します

applicationContext.xmlで以下を定義したと仮定します

<import resource="test1.xml" />
<import resource="test2.xml" />
<import resource="test3.xml" />
<import resource="test4.xml" />

Beanは、4つの構成ファイルtest1.xmltest2.xmltest3.xmltest4.xmlからインスタンス化されます。

結論:シナリオ2では、applicationContextとDispatcherServlet関連していません。

シナリオ3

Spring MVCを使用するWebアプリケーション。

ではweb.xmlの定義:

<servlet>
    <servlet-name>springweb</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    
</servlet>

<servlet-mapping>
    <servlet-name>springweb</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

Tomcatが起動すると、springweb-servlet.xmlで定義されたBean がインスタンス化されます。 DispatcherServlet伸びFrameworkServletます。でFrameworkServlet豆のインスタンスspringwebのために行われます。私たちの場合、springwebはFrameworkServletです。

結論:シナリオ3では、applicationContextとDispatcherServlet関連していません。

シナリオ4

Spring MVCを使用するWebアプリケーション。サーブレットの場合はspringweb-servlet.xml、サーバープログラム内のビジネスサービスにアクセスする場合、または別のサーバープログラムのDBサービスにアクセスする場合はapplicationContext.xml

web.xml以下が定義されています。

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>springweb</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        
</servlet>

<servlet-mapping>
    <servlet-name>springweb</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

サーバーの起動時に、applicationContext.xmlでContextLoaderListener定義されたBeanをインスタンス化します。ここで宣言したと仮定します:

<import resource="test1.xml" />
<import resource="test2.xml" />
<import resource="test3.xml" />
<import resource="test4.xml" />

Beanはすべて、4つのtest1.xmltest2.xmltest3.xmltest4.xmlからインスタンス化されます。applicationContext.xmlで定義されたBeanのインスタンス化が完了すると、springweb-servlet.xmlで定義されたBeanがインスタンス化されます。

したがって、インスタンス化の順序は、ルート(アプリケーションコンテキスト)、次にFrameworkServletです。

これで、どのシナリオでそれらが重要なのかが明確になります。


10
+1。このタイプの比較を探していましたが、見つかりませんでした。
Ninad Pingale 2014

@abishkarバッタライ非常に良い、私の質問は:とき「シナリオ4」Beanを作成するために、コンポーネント@と値注釈@使用している場合はそう何
ローレンス

DispatcherServletURLが.actionで終わっていない場合、springweb は呼び出されませんか?
Asif Mushtaq 2018

@lawrence Springがスキャンでそのコンポーネントを見つけることができるように、springweb-servlet.xmlでクラスパスを指定する必要があります。
veritas

54

もう一点付け加えたい。ではspring-servlet.xml、私たちは、コントローラパッケージの構成要素のスキャンが含まれています。次の例では、コントローラーパッケージのフィルター注釈を含めます。

<!-- Scans for annotated @Controllers in the classpath -->
<context:component-scan base-package="org.test.web" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

ではapplicationcontext.xml、私たちコントローラを除くパッケージを、残りのフィルタを追加します。

<context:component-scan base-package="org.test">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

9
どうして ?なぜ全部を一度だけスキャンしないのですか?
NimChimpsky 2012

3
@NimChimpsky @ControllerサーブレットコンテキストでBean をスキャンする必要があります(Spring MVCで必要)。
Tuukka Mustonen 2012年

3
全体を2度できませんか?なぜ含める/除外するのですか?
マイクリランダー、2013

8
また、spring-servlet.xmlにuse-default-filters = "false"属性を追加する必要があります
Rakesh Waghela '25

4
ラケシュ・ワゲラはポイントを持っています。その属性がない場合、コントローラーBeanは2回作成されます。最初はappContextで、次にservletContextで
UltraMaster

12

簡単に言えば、

applicationContext.xmlすべてのサーブレット間で共有されるBeanを定義します。アプリケーションに複数のサーブレットがある場合は、で共通リソースを定義applicationContext.xmlする方が理にかなっています。

spring-servlet.xmlそのサーブレットにのみ関連するBeanを定義します。これはディスパッチャーサーブレットです。したがって、Spring MVCコントローラーをこのファイルで定義する必要があります。

spring-servlet.xmlWebアプリケーションでサーブレットを1つだけ実行している場合でも、すべてのBeanを定義しても問題はありません。


3
すべてのBeanをspring-servlet.xmlで定義できますが、この場合は空(Beanなし)のapplicationContext.xmlも必要です。正しい?
ミハイルコピロフ2015

6

サーブレット技術では、特定のサーブレットに入力を渡したい場合は、以下のコードのようにinit paramを渡す必要があります。

 <servlet>
    <servlet-name>DBController</servlet-name>
    <servlet-class>com.test.controller.DBController</servlet-class>
    <init-param>
        <param-name>username</param-name>
        <param-value>John</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>DBController</servlet-name>
    <url-pattern>/DBController</url-pattern>
</servlet-mapping>

すべてのサーブレットに共通するいくつかの入力を渡したい場合は、そのときにコンテキストパラメータを設定する必要があります。例

 <context-param>
    <param-name>email</param-name>
    <param-value>admin@example.com</param-value>
</context-param>

Spring MVCで作業しているときは、これとまったく同じように、init paramを介して、DispatcherServletである、Springによって提供される事前定義サーブレットに情報を提供する必要があります。したがって、構成は休閑地です。ここでは、DispatcherServletのinitパラメータとしてspring-servlet.xmlを提供しています。

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
              http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>Spring MVC App</display-name>

    <servlet>
        <servlet-name>SpringController</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SpringController</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
</web-app>

ここでも、いくつかのコンテキストパラメータが必要です。これはアプリケーション全体に当てはまります。したがって、applicationcontext.xmlであるルートコンテキストを提供できます。構成は次のようになります。

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationcontext.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
        <servlet-name>SpringController</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SpringController</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>

4

アプリケーションコンテキストは、これらのメッセージの国際化のサポートを含む、テキストメッセージを解決する手段を提供します。アプリケーションコンテキストは、画像などのファイルリソースをロードする一般的な方法を提供します。アプリケーションコンテキストは、リスナーとして登録されているBeanにイベントを発行できます。Beanファクトリーを使用してプログラムで処理する必要があるコンテナーまたはコンテナー内のBeanに対する特定の操作は、アプリケーションコンテキストで宣言的に処理できます。ResourceLoaderのサポート:SpringのResourceインターフェースは、低レベルのリソースを処理するための柔軟で汎用的な抽象化を使用します。アプリケーションコンテキスト自体はResourceLoaderであるため、アプリケーションにデプロイメント固有のResourceインスタンスへのアクセスを提供します。MessageSourceサポート:アプリケーションコンテキストは、ローカライズされたメッセージを取得するために使用されるインターフェイスであるMessageSourceを実装します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.