applicationContextを複数のファイルに分割する
-
03-07-2019 - |
質問
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
セクションとcontext-param
セクションの両方で構成場所を指定する必要がありますか?
foo-servlet.xml
で定義されたBeanをfoo-service.xml
から参照できるようにするには、何を覚えておく必要がありますか?これは、contextConfigLocation
で<=>を指定することに関係していますか?
更新1:
Spring フレームワーク3.0を使用しています。次のようにリソースのインポートを行う必要がないことは私の理解です:
<import resource="foo-services.xml"/>
これは正しい仮定ですか?
解決
次のセットアップが最も簡単だと思います。
のデフォルトの設定ファイル読み込みメカニズムを使用します。 DispatcherServlet :
フレームワークは、初期化時に DispatcherServletの場合、 [servlet-name] -servlet.xmlという名前のファイル WebのWEB-INFディレクトリ アプリケーションとBeanの作成 そこに定義されている( で定義されたBeanの定義 グローバルスコープの同じ名前)。
あなたの場合、単にintrafest-servlet.xml
ディレクトリーにファイルWEB-INF
を作成し、web.xml
に特定の情報を指定する必要はありません。
context-param
ファイルでは、インポートしてXML構成を作成します。
<beans>
<bean id="bean1" class="..."/>
<bean id="bean2" class="..."/>
<import resource="foo-services.xml"/>
<import resource="foo-persistence.xml"/>
</beans>
実際には、Springチームは(Web)ApplicationContextを作成するときに複数の構成ファイルをロードすることを好みます。それでもこの方法でやりたい場合は、コンテキストパラメータ(init-param
)と サーブレット初期化パラメータ(<=>)の両方を指定する必要はないと思います。 2つのうちの1つで十分です。コンマを使用して、複数の構成場所を指定することもできます。
他のヒント
Mike Neresonのブログには次のように書かれています:
http://blog.codehangover.com/load-multiple-contexts-into-spring/
これを行うにはいくつかの方法があります。
1。 web.xml contextConfigLocation
最初のオプションは、それらすべてをWebアプリケーションにロードすることです ContextConfigLocation要素を介したコンテキスト。あなた<!>#8217;すでに行っています <!>#8217;書いていると仮定して、ここにプライマリapplicationContextを持つ Webアプリケーション。あなたがする必要があるのは、間に空白を入れることです 次のコンテキストの宣言。
<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インポートリソース
他のオプションは、プライマリapplicationContext.xmlを追加することです web.xmlに追加し、そのプライマリコンテキストでimportステートメントを使用します。
applicationContext.xml
には<!>#8230;<!-- 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
リソースを使用します。
処理しているコンテキストには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>
@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に入れるこれらのインポートステートメント。
これが役立つことを感謝します。
私は modular-spring-contexts の著者です。
これは、 XMLベースの構成メタデータの作成。 modular-spring-contexts
は基本的にスタンドアロンのアプリケーションコンテキストであるモジュールを定義し、モジュールが他のモジュールからBeanをインポートできるようにすることで機能します。他のモジュールは<!>#237; n元のモジュールです。
キーポイントは次のとおりです
- モジュール間の依存関係の制御
- どの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>