web-dev-qa-db-ja.com

applicationContextを複数のファイルに分割する

Springの構成を複数のxmlファイルに分割する正しい方法は何ですか?

今のところ

  • /WEB-INF/foo-servlet.xml
  • /WEB-INF/foo-service.xml
  • /WEB-INF/foo-persistence.xml

私のweb.xmlには次のものがあります:

<servlet>
    <description>Spring MVC Dispatcher Servlet</description>
    <servlet-name>intrafest</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/foo-*.xml
        </param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
            /WEB-INF/foo-*.xml
    </param-value>
</context-param>


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

実際の質問:

  • このアプローチは正しい/ベストですか?
  • DispatcherServlet[〜#〜] and [〜#〜]context-paramセクションの両方で設定場所を本当に指定する必要がありますか?

foo-servlet.xmlで定義されたBeanをfoo-service.xmlから参照できるようにするには、何を覚えておく必要がありますか?これは、web.xmlcontextConfigLocationを指定することに関係していますか?

更新1:

私はSpringframework 3.0を使用しています。次のようなリソースのインポートを行う必要がないことは私の理解です。

 <import resource="foo-services.xml"/> 

これは正しい仮定ですか?

58
kosoant

次のセットアップが最も簡単だと思います。

DispatcherServlet のデフォルトの構成ファイル読み込みメカニズムを使用します。

フレームワークは、DispatcherServletの初期化時に、WebアプリケーションのWEB-INFディレクトリで[servlet-name] -servlet.xmlという名前のファイルを探し、そこに定義されたBeanを作成します(定義されたBeanの定義を上書きします)グローバルスコープの同じ名前)。

あなたの場合、ファイルintrafest-servlet.xmlWEB-INFディレクトリに作成するだけで、web.xmlに特定の情報を指定する必要はありません。

intrafest-servlet.xmlファイルでは、 import を使用してXML構成を構成できます。

<beans>
  <bean id="bean1" class="..."/>
  <bean id="bean2" class="..."/>

  <import resource="foo-services.xml"/>
  <import resource="foo-persistence.xml"/>
</beans>

(Web)ApplicationContextを作成するとき、Springチームは実際に複数の構成ファイルをロードすることを好むことに注意してください。それでもこの方法でやりたい場合は、コンテキストパラメータ(context-paramサーブレット初期化の両方を指定する必要はないと思いますパラメータ(init-param)。 2つのうちの1つで十分です。コンマを使用して、複数の構成場所を指定することもできます。

48
eljenso

Mike Neresonのブログには次のように書かれています:

http://blog.codehangover.com/load-multiple-contexts-into-spring/

これを行うにはいくつかの方法があります。

1。 web.xml contextConfigLocation

最初のオプションは、ContextConfigLocation要素を介してすべてをWebアプリケーションコンテキストにロードすることです。 Webアプリケーションを作成していることを前提に、すでにここにプライマリapplicationContextがあります。必要なのは、次のコンテキストの宣言の間に空白を入れることだけです。

  <context-param>
      <param-name> contextConfigLocation </param-name>
      <param-value>
          applicationContext1.xml
          applicationContext2.xml
      </param-value>
  </context-param>

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

上記ではキャリッジリターンを使用しています。代わりに、スペースを入れることもできます。

  <context-param>
      <param-name> contextConfigLocation </param-name>
      <param-value> applicationContext1.xml applicationContext2.xml </param-value>
  </context-param>

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

2。 applicationContext.xmlインポートリソース

もう1つのオプションは、プライマリapplicationContext.xmlをweb.xmlに追加し、そのプライマリコンテキストでimportステートメントを使用することです。

applicationContext.xmlには…

  <!-- hibernate configuration and mappings -->
  <import resource="applicationContext-hibernate.xml"/>

  <!-- ldap -->
  <import resource="applicationContext-ldap.xml"/>

  <!-- aspects -->
  <import resource="applicationContext-aspects.xml"/>

どの戦略を使用すべきですか?

1。私は常にweb.xmlを介してロードすることを好みます。

なぜなら、これにより、すべてのコンテキストを互いに分離した状態に保つことができるからです。テストでは、これらのテストを実行するために必要なコンテキストのみをロードできます。これにより、コンポーネントがloosely coupledのままであるため、開発もモジュール化され、将来、パッケージまたは垂直レイヤーを抽出して独自のモジュールに移動できます。

2。non-web applicationにコンテキストをロードする場合、importリソースを使用します。

27
Human Being

私たちが扱っているコンテキストには2つのタイプがあります。

1:ルートコンテキスト(親コンテキスト。通常、すべてのjdbc(ORM、Hibernate)初期化およびその他のセキュリティ関連の設定を含む)

2:個々のサーブレットコンテキスト(子コンテキスト。通常はDispatcherサーブレットコンテキスト。spring-mvcに関連するすべてのBean(コントローラー、URLマッピングなど)を初期化します)。

複数のアプリケーションコンテキストファイルを含むweb.xmlの例を次に示します

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://Java.Sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee
                            http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <display-name>Spring Web Application example</display-name>

    <!-- Configurations for the root application context (parent context) -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/jdbc/spring-jdbc.xml <!-- JDBC related context -->
            /WEB-INF/spring/security/spring-security-context.xml <!-- Spring Security related context -->
        </param-value>
    </context-param>

    <!-- Configurations for the DispatcherServlet application context (child context) -->
    <servlet>
        <servlet-name>spring-mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/spring/mvc/spring-mvc-servlet.xml
            </param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <url-pattern>/admin/*</url-pattern>
    </servlet-mapping>

</web-app>
13
user2815238

@eljenso:アプリケーションがSPRING WEB MVCを使用する場合、intrafest-servlet.xml webapplication context xmlが使用されます。

それ以外の場合、@ kosoantの設定は問題ありません。

SPRING WEB MVCを使用せずに、SPRING IOCを使用したい場合:

Web.xmlで:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-context.xml</param-value>
</context-param>

次に、application-context.xmlに次が含まれます:<import resource="foo-services.xml"/>これらのインポート文は、さまざまなアプリケーションコンテキストファイルをロードし、メインのapplication-context.xmlに入れます。

おかげで、これが役立つことを願っています。

6
Sreeni

私は modular-spring-contexts の著者です。

これは、 XMLベースの構成メタデータの構成 を使用して達成されるよりも、スプリングコンテキストのよりモジュール化された編成を可能にする小さなユーティリティライブラリです。 modular-spring-contextsは、基本的にスタンドアロンのアプリケーションコンテキストであるモジュールを定義し、モジュールが他のモジュールからBeanをインポートできるようにすることで機能します。他のモジュールは、元のモジュールにエクスポートされます。

キーポイントは

  • モジュール間の依存関係の制御
  • どのBeanがエクスポートされ、どこで使用されるかを制御する
  • beanの命名の衝突の可能性を低減

簡単な例は次のようになります。

ファイルmoduleDefinitions.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:module="http://www.gitlab.com/SpaceTrucker/modular-spring-contexts"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.gitlab.com/SpaceTrucker/modular-spring-contexts xsd/modular-spring-contexts.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config />

    <module:module id="serverModule">
        <module:config location="/serverModule.xml" />
    </module:module>

    <module:module id="clientModule">
        <module:config location="/clientModule.xml" />
        <module:requires module="serverModule" />
    </module:module>

</beans>

ファイルserverModule.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:module="http://www.gitlab.com/SpaceTrucker/modular-spring-contexts"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.gitlab.com/SpaceTrucker/modular-spring-contexts xsd/modular-spring-contexts.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config />

    <bean id="serverSingleton" class="Java.math.BigDecimal" scope="singleton">
        <constructor-arg index="0" value="123.45" />
        <meta key="exported" value="true"/>
    </bean>

</beans>

ファイルclientModule.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:module="http://www.gitlab.com/SpaceTrucker/modular-spring-contexts"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.gitlab.com/SpaceTrucker/modular-spring-contexts xsd/modular-spring-contexts.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config />

    <module:import id="importedSingleton" sourceModule="serverModule" sourceBean="serverSingleton" />

</beans>
1
SpaceTrucker