私はSpringCore認定の勉強をしていますが、提供された学習資料にあるこの質問については、いくつかの疑問があります。
アプリケーションコンテキストを閉じるための好ましい方法は何ですか?
私はこのようなものがあれば知っています:
_ConfigurableApplicationContext context = …
// Destroy the application
context.close();
_
contextオブジェクトでclose()メソッドを使用すると、ApplicationContextが閉じられ、アプリケーションが破棄されます。
しかし、これは私がしなければならない最善の方法ではないと思います。
公式ドキュメントを読むと、次のようなこともできることがわかりました。
_context.registerShutdownHook();
_
that シャットダウンフックをJVMに登録するしたがって、JVMが終了する前にSpringのクローズフェーズをトリガーするのはJVMです。したがって、JVMの終了時に、Springのクローズフェーズが実行されます。
ドキュメントで私はそれを読むことができます:多くのアプリケーション(Webアプリケーション)が無期限に実行されるため、通常はcontext.close()
を呼び出すことはできませんしかし、この最後のアサーションは正確にはどういう意味ですか?なぜWebアプリケーションが無期限に実行されるのですか?
だから私の質問は:
context.close()
を尊重することをお勧めしますか?Tnx
ContextLoaderListener
がApplicationContextの初期化と破棄を処理することを知っているので、サーバーをシャットダウンすると、そのContextLoaderListenerのcontextDestroyed
メソッドが呼び出されます。
public void contextDestroyed(ServletContextEvent event){
closeWebApplicationContext(event.getServletContext());
ContextCleanupListener.cleanupAttributes(event.getServletContext());
}
そのcloseWebApplicationContext
では、実際には次のようにApplicationContextでclose
メソッドを呼び出します。
if ((this.context instanceof ConfigurableWebApplicationContext)) {
((ConfigurableWebApplicationContext)this.context).close();
}
これはspring-web-4.1.5.jar
から直接です。ここから明らかなように、彼らはclose
を使用してWebアプリケーションのApplicationContextを破棄します。
ただし、registerShutdownHook
は、スタンドアロンデスクトップアプリケーションなどの非WebアプリケーションでIoCコンテナを明示的にシャットダウンするために使用されます。特に、ClassPathXmlApplicationContext(または)FileSystemXmlApplicationContext(または)他のタイプから手動でApplicationContextを作成する場合に使用されます。
これは、Springアプリケーションで使用されているすべてのリソースを解放し、SpringBeanでdestroyメソッドを呼び出すために行われます。
ドキュメントで私はそれを読むことができます:多くのアプリケーション(Webアプリケーション)が無期限に実行されるため、通常context.close()を呼び出すことはできませんしかし、この最後のアサーションは正確にはどういう意味ですか?なぜWebアプリケーションが無期限に実行されるのですか?
Webアプリケーションは、それをデプロイするアプリケーションサーバーが実行されている限り実行されます。アプリケーションを正しく開始および停止するのは、アプリケーションサーバーの責任です(ユーザーの責任ではありません)。これは、アプリケーションサーバーが停止すると、サーブレットコンテキストが破棄されることを意味します。 Springアプリケーションでは、_web.xml
_に登録されている ContextLoaderListener
クラスがこのイベントをリッスンし(コンテキストが破棄され)、Springコンテキストを適切に閉じます。
アプリケーションサーバーの外部でSpringを使用する場合(スタンドアロンアプリケーションなど)、Springコンテキストを正しく停止するのはユーザーの責任です。あなたが言ったように、これは明示的にcontext.close()
を呼び出すか、この呼び出しを行うシャットダウンフック(context.registerShutdownHook()
)を登録することによって行うことができます。