Spring ApplicationContextを閉じる方法は?


83

アプリケーションが終了したら、Springコンテキストを閉じたいと思います。
関連するコードにApplicationContext参照がありますが、closeメソッドが見つかりませんでした。

回答:


149

あなたのダウンキャストApplicationContextConfigurableApplicationContextかを定義するclose()方法を:

((ConfigurableApplicationContext)appCtx).close();

13
キャストすることもできますAbstractApplicationContext
eeezyy 2014

3
@ eeezyy-AbstractApplicationContextクラスでConfigurableApplicationContextあり、そのクラスによって実装されるインターフェイスであるため、ほとんどの場合、後者を使用することをお勧めします。
Periata Breatta 2016

3
以下のようConfigurableApplicationContextになりまし拡張Closableはるかに短いバージョンである(この変更がで行われたバージョンを知っているが、3.0.xのは、そうではない4.2.xではためのドキュメントがそれを示していません)((Closable)context).close();
Periata Breatta 2016

6
今もありますAutoCloseable、あなたが変数に自分のコンテキスト保存などのリソースを試し-で、今限り、使用することができることを意味実装、AutoCloseableつまりインターフェースが表示されている、try (ConfigurableApplicationContext context = new ....) { /* your code goes here */ } // context is closed when you leave the try block
Periata Breatta

コンテキストをどこで閉じる必要がありますか?MessageListenerクラスのonMessage()メソッドを介して常にメッセージを取得するリスナーアプリケーションがあります。最終的にエグゼキュータをシャットダウンするには、どの部分でアプリケーションコンテキストを閉じる必要がありますか?
ワックス2017年

36

以下に示すように、シャットダウンフックをJVMに登録する必要があります。

((AbstractApplicationContext)appCtx).registerShutdownHook();

詳細については、以下を参照してください。Springマニュアル:3.6.1.6Web以外のアプリケーションでSpringIoCコンテナーを正常にシャットダウンする


奇妙なことに、これはテストクラスでは機能しませんが、main()の最後でAvnerLevyの回答を使用しても機能します。
JReader 2015

1
@ JReader-シャットダウンフックは多くの状況で信頼性が低く、ほとんどのテストフレームワーク(通常、VMは実行中のテスト間で実際に終了しないため)またはかなりの数のアプリケーションフレームワーク(サーブレットなど-できるものなら何でも)では実行されません。基本的に、仮想マシンを終了せずにアプリケーションを終了してリロードします)。あなたのコードが使用されるだろう、何をやっているとどのように知っている限りあなたはおそらくそれらを使用するべきではありません...
Periata Breatta

13

以下のようにコンテキストを初期化する場合

ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); 

これらのようなクリーンなコンテキスト

((ClassPathXmlApplicationContext) context).close();

12

Java SE 7以降の場合は、閉じないで、try-with-resourcesを使用して、ステートメントの最後で各リソースが確実に閉じられるようにします。

try(final AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"classpath*:META-INF/spring/*.xml" }))
{
     //write your code
}

1

ApplicationContextオブジェクトを閉じる手順

  1. ApplicationContextオブジェクトをConfigurableApplicationContextオブジェクトにキャスト」と入力します。
  2. 次に、その上でcloseオブジェクトを呼び出します。

例:

 ApplicationContext context = new ClassPathXmlApplicationContext("mybeans.xml");

((ConfigurableApplicationContext)context ).close();

1
public static void main(String[] args) {
    ApplicationContext context=new ClassPathXmlApplicationContext("SpringCnf.xml");
    Resturant rstro1=(Resturant)context.getBean("resturantBean");
    rstro1.setWelcome("hello user");
    rstro1.welcomeNote();
    ((ClassPathXmlApplicationContext) context).close();

1
古い投稿に回答するときは、コードだけでなく、回答にコンテキストを提供できれば、他の人にとってより役立つ可能性があるので便利です。
デビッドバック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.