【发布时间】:2015-05-24 01:29:39
【问题描述】:
我正在学习 Spring Core 认证,我对在提供的学习材料中发现的这个问题有些疑问:
关闭应用程序上下文的首选方式是什么?
我知道如果我有这样的事情:
ConfigurableApplicationContext context = …
// Destroy the application
context.close();
通过在 context 对象上使用 close() 方法,ApplicationContext 被关闭并且应用程序被销毁。
但我认为这不是我必须这样做的最佳方式。
阅读官方文档我发现我也可以这样做:
context.registerShutdownHook();
向 JVM 注册一个 Shutdown Hook,因此 JVM 将在 JVM 退出之前触发 Spring 的关闭阶段。所以在 JVM 退出时,Spring 的关闭阶段将执行。
在文档中我可以读到:通常不可能调用context.close(),因为许多应用程序(Web 应用程序)无限期地运行 但是最后一个断言到底意味着什么?为什么 Web 应用程序会无限期运行?
所以我的问题是:
- 我可以使用第二种方法关闭应用程序上下文,也可以使用非 Web 应用程序吗?
- 是否优先尊重
context.close()?
Tnx
【问题讨论】:
-
many applications (web applications) run indefinitely..它通常指的是在无限循环中发生的事情,除非你停止这个过程,比如你的 SocketServer 监听传入的请求。为什么要首先手动关闭 WebApplicationContext ?它通常在服务器启动时创建并在服务器关闭时销毁 -
Web 应用程序永远不会停止,因为如果您这样做,站点就会关闭。如果您想停止运行 Web 应用程序,您将关闭它(例如通过停止 Web 服务器)。当您这样做时,JVM 也将停止,因此“关闭 JVM 挂钩”是关闭 JVM 上下文的方法。为什么要停止上下文?
-
close 用于 Web 应用程序,而 shutDownHook 用于独立应用程序。刚刚发布了我的答案,并提供了更多细节:)
标签: java spring spring-mvc applicationcontext