サーブレット3(Tomcat 7)+ Spring 3.1を使用しており、WebApplicationInitializerを使用してWebアプリケーションをロードしようとしています。
私が見た通常の例では、ContextLoaderListenerがロードされたルートApplicationContextと、DispatcherServletがロードされたサーブレットApplicationContextがあります。
(明確にするために、私はweb.xmlについて話しているのではなく、プログラム的にWebApplicationInitializer内で話している)。
ここで、ApplicationContextsの階層を作成したいとします。たとえば、次のようにします。
ルート->AppContext1->AppContext2-> ServletAppContext
->は親->子の関係を示します。各AppContextは、独自のBeanとその祖先のBeanにアクセスできます。
例:
- ルートは、プロパティ、DAOおよびTXを定義します。
- AppContext1は、JPAおよびSpringDataリポジトリーを定義します。
- AppContext2は、JMSおよびSpring統合パイプを定義します。
- ServletAppContextは、コントローラーとビューを定義します。
私の最初のアプローチは、ルートApplicationContextをContextLoaderListenerに追加し、それをAppContext1の親として設定することでした。AppContext1をAppContext2の親として設定します。AppContext2をServletAppContextの親として設定します。そして最後に、ServletAppContextをDispatcherServletに関連付けます。
シャットダウン時に、DispatcherServletはServletAppContextを閉じますが、伝播しません。AppContext1とAppContext2は、Beanに対して閉じられることはなく、解放されることもありません。だから私は間違ったアプローチを使用していると思います。
AppContext2をRootではなくContextLoaderListenerに関連付けてみました。この場合、AppContext2は閉じますが、AppContext1とRootは開いたままになります。
また、AppContext(Root、1、2)ごとに1つずつ、3つのContextLoaderListenerを設定することはできません。
私の質問は、この状況に対する正しいアプローチは何ですか?私は提案を受け入れています。