私は、共通のオブジェクトを含む 1 つの jar と、共通の jar を使用したい 2 つの war webapps を含む ear パッケージを持っています。DispatcherServlet の ContextLoaderListener と webapp コンテキストを介してアプリケーション全体のコンテキストを使用するように構成をセットアップしました。
私のデモアプリのセットアップはおおよそ次のとおりです
common.jar
applicationContext.xmlとbeanRefContext.xmlが含まれています。これらは、アプリケーション (ear) ワイド コンテキストであると想定されています。ファイルは以下のようなものです。共有名前空間は、共有 Bean が配置されている場所です。
アプリケーションコンテキスト
<beans>
<!-- namespace etc declarations omitted -->
<context:annotation-config />
<context:component-scan base-package="study.spring.multicontext.shared" />
</beans>
beanRefContext.xml
<beans>
<!-- namespace etc declarations omitted -->
<bean id="sharedContext" class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg>
<list>
<value>classpath*:applicationContext.xml</value>
</list>
</constructor-arg>
</bean>
</beans>
webapp1
以下のようなweb.xmlファイルを使用しwebapp2
て個別の war としてパッケージ化された Spring MVC アプリケーションです。<web-app> <context-param> <param-name>parentContextKey</param-name> <param-value>sharedContext</param-value> </context-param> <context-param> <param-name>locatorFactorySelector</param-name> <param-value>classpath:beanRefContext.xml</param-value> </context-param> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dos</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/dos-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dos</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
およびxx-servlet.xmlは、webapp 固有のコンテキストと同様です。web名前空間は、コントローラーが配置されている場所です。
<beans>
<!-- namespace etc declarations omitted -->
<context:component-scan base-package="study.spring.multicontext.web"/>
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="suffix" value=".jsp"/>
</bean>
</beans>
共有 Bean は、Controller クラスの通常の方法で @Autowired です
@Autowired MySharedBean mySharedBean
ear パッケージには wars と jar の両方が含まれており、構造は次のようになります。
ear | |--common.jar | |--META-INF | |--applicationContext.xml | |--beanRefContext.xml | |--webapp1.war | |--WEB-INF | |--xx-servlet.xml | |--web.xml | |--webapp2.war | |--WEB-INF | |--xx-servlet.xml | |--web.xml
問題は、Bean のインスタンスが 2 つ残っていることです。各 war には Controller が 1 つしかないため、Controller/webapp ごとに 1 つです。構成をいじってみましたが、何をしてもインスタンスが 0 個か 2 個しか取得できません。
メモリーダンプから Eclipse MAT で参照を確認したところ、実際には 4 つのインスタンスがありましたが、2 つが Spring 内部で使用されていると推測されます。とにかく、そこから、各コントローラーが独自のインスタンスを持っていることがはっきりとわかります。
私は、これはこれと同じくらい簡単であるべきだと言っている多くのブログ投稿、ディスカッション フォーラムなどを読みました。JNDIを提案する人もいますが、私が理解しているように、JNDIがなくても可能です。
そして、戦争を組み合わせて、瓶を中に束ねることはできません。このデモ アプリでは機能する可能性があるため、私が扱っている実際のケースではこれが許可されていません。
この問題に関するヘルプは大歓迎です。前もって感謝します。
Spring 2.X 用の2007 年の SpringSource の例。同じことを行いますが、構成が異なります。報奨金の説明に記載されているように、少し時代遅れで、Spring 3.X ベースのソリューションを探しています。