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.xml
でcontextConfigLocation
を指定することに関係していますか?
更新1:
私はSpringframework 3.0を使用しています。次のようなリソースのインポートを行う必要がないことは私の理解です。
<import resource="foo-services.xml"/>
これは正しい仮定ですか?
次のセットアップが最も簡単だと思います。
DispatcherServlet のデフォルトの構成ファイル読み込みメカニズムを使用します。
フレームワークは、DispatcherServletの初期化時に、WebアプリケーションのWEB-INFディレクトリで[servlet-name] -servlet.xmlという名前のファイルを探し、そこに定義されたBeanを作成します(定義されたBeanの定義を上書きします)グローバルスコープの同じ名前)。
あなたの場合、ファイルintrafest-servlet.xml
をWEB-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つで十分です。コンマを使用して、複数の構成場所を指定することもできます。
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
リソースを使用します。
私たちが扱っているコンテキストには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をインポートできるようにすることで機能します。他のモジュールは、元のモジュールにエクスポートされます。
キーポイントは
簡単な例は次のようになります。
ファイル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>