14

次のように定義されたSpring Beanがありbeans.xmlます。

<context:annotation-config />
[...]
<bean id="myBackend" class="mycompany.BackendBean" scope="singleton" />

Bean 内には 2 つのメソッドがあり、Web アプリケーションの開始時と終了前に実行する必要があります。

public class BackendBean implements IBackend {
    private static final Logger LOGGER = LoggerFactory
            .getLogger(BackendBean.class);

    @PostConstruct
    public void init()
    {
        LOGGER.debug("init");
    }

    @PreDestroy
    public void destroy()
    {
        LOGGER.debug("destroy");
    }
}

サーバー ( mvn jetty:run) を実行すると、コンソールにメソッドの出力が表示され、メソッドが実行されinitたと判断できます。init

を押しCtrl-Cて Jetty のシャットダウンを開始すると、destroyメソッドの出力が表示されません。

destroyアプリケーションが終了したときにメソッドが実行されるようにするには、何を変更すればよいですか?

4

7 に答える 7

16

アプリケーションのシャットダウン時にSpring がコール@PreDestroyバック メソッドを呼び出すには、シャットダウン フックを追加し、アプリケーション コンテキストを閉じる必要があります。JVM を使用してRuntime.getRuntime().addShutdownHook(Thread)、または Jetty がそのような API を提供する場合は、Jetty にフックをアタッチできます。JVM シャットダウン フックを使用して行う方法は次のとおりです。

final ApplicationContext appContext = ... // create your application context 
                         // using one of the various application context classes
Runtime.getRuntime().addShutdownHook(new Thread() {
   public void run() {
       appContext.close();
   }});
于 2013-05-04T10:56:16.993 に答える
6

「プロトタイプ」スコープ Bean で注意する必要がある微妙な点を次に示します。

「プロトタイプ」スコープ Bean の場合、Spring は @PreDestroy メソッドを呼び出しません。

Spring公式リファレンスマニュアルからの回答は次のとおりです。

セクション 1.5.2 (ここを参照)

他のスコープとは対照的に、Spring はプロトタイプ Bean の完全なライフサイクルを管理しません**: コンテナーは、プロトタイプ オブジェクトをインスタンス化し、構成し、その他の方法でアセンブルし、それをクライアントに渡します。そのプロトタイプ インスタンスのそれ以上の記録はありません。 .

したがって、初期化ライフサイクル コールバック メソッドはスコープに関係なくすべてのオブジェクトで呼び出されますが、プロトタイプの場合、構成された破棄ライフサイクル コールバックは呼び出されません。クライアント コードは、プロトタイプ スコープのオブジェクトをクリーンアップし、プロトタイプ Bean が保持している高価なリソースを解放する必要があります。

Spring コンテナーがプロトタイプ スコープの Bean によって保持されているリソースを解放するようにするには、クリーンアップが必要な Bean への参照を保持するカスタム Bean ポスト プロセッサを使用してみてください。

: これは、XML 構成にも適用されます。

于 2019-12-15T10:32:21.127 に答える