回答
在 Spring 中,Shutdown Hook
的作用是保证在应用程序关闭时能够执行一些必要的清理工作,比如关闭数据库连接、停止正在运行的任务等等其他类型的清理操作,这是应用程序在终止运行时比较优雅的释放资源的动作。
Shutdown Hook
是 Java 的一个特性,Spring 在其生命周期管理中利用这一特性,确保所有注册的bean在关闭时能够被适当地销毁。当Spring应用程序运行时,如果它接收到关闭信号,JVM会执行已注册的Shutdown Hook
,Spring会在其上下文关闭时,调用所有注册bean的destroy()
方法,确保所有资源都能够得到正确释放。
详解
Shutdown Hook 介绍
Shutdown Hook
是 Java 提供的一种机制,它允许我们在 JVM 关闭时执行一些特定的操作,比如释放资源、保存状态等等,这是一种在程序终止之前进行清理工作的比较有效的方式。
我们可以将 Shutdown Hook
理解为一个简单的已初始化但是未启动的特殊线程,当 JVM 由于某些原因被终止时,它会被调用。
我们可以在这个特殊的线程中添加自己的清理代码,来确保应用程序能够在关闭时执行必要的清理工作,比如:
- 关闭数据库连接
- 释放文件句柄
- 结束定时任务
- 保存程序状态
我们可以使用 Runtime.getRuntime().addShutdownHook(Thread hook)
来注册一个 Shutdown Hook
,这个 Shutdown Hook
会在 JVM 关闭时被执行。以下一些场景可能会触发 Shutdown Hook
的调用。
- 程序正常退出
public class ShutdownHookDemo {
static {
Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println("执行 Shutdown Hook ...")));
}
public static void main(String[] args) throws Exception {
System.out.println("程序开始执行,now time:" + LocalDateTime.now());
TimeUnit.SECONDS.sleep(3);
System.out.println("程序即将退出,now time:" + LocalDateTime.now());
}
}