2

サーブレット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を設定することはできません。

私の質問は、この状況に対する正しいアプローチは何ですか?私は提案を受け入れています。

4

2 に答える 2

1

親コンテキストを閉じないデフォルトの動作は、単一の親コンテキストが複数の子コンテキストによって共有される可能性があるためです。このようなシナリオでは、すべての子コンテキストが閉じられた後にのみ、親コンテキストを閉じることができます。

それが線形関係である場合(つまり、コンテキストごとに子が1つしかない場合)、closeメソッドが親closeを呼び出す拡張ApplicationContext実装を使用できます。

線形関係でない場合は、参照カウントメカニズムを実装して、アクティブな子コンテキストが0に達したときに、コンテキストを閉じるときに、そこにあるアクティブな子コンテキストの数を追跡できます。

これを行う前に、コンテキストが非常に多い理由を強く再検討する必要があります。2つのコンテキストのみを作成し、インポートを使用して構成ファイルを接続する方がよい場合があります。私にはエンジニアリングがやり過ぎのように見えます。私はこのようなことをする良いユースケースを考えることができません、あなたがこれをしている理由を聞くことに非常に興味があります。

于 2012-10-20T02:52:51.637 に答える
0

ですから、明らかに私はSpring(少なくともバージョン3.1まで)が実行する準備ができていないことを実行しようとしています。

于 2012-11-21T14:13:20.460 に答える