什么是钩子函数,在学习钩子函数之前,小编先提一个面试问题。
请问在Spring中,如果JVM异常终止,Spring是如何保证会释放掉占用的资源,比如说数据库连接等资源呢?
钩子函数非常简单,简单到小编只用摘抄一段Spring代码即可。走你,现在开始。
我们知道在Spring中定义销毁方法有两种方式
这里就要用到钩子函数了, Spring 的钩子函数在 AbstractApplicationContext#shutdownHook属性。
如果我们是SpringBoot项目我们看到在SpringApplication启动时候会注册一个钩子函数
简直太简单了,没有任何学习成本。一行代码就能搞定。
只要不是机器断电,强制kill -9 强制杀进程,都会触发。
正如上图所示优雅停机,在项目将要关闭时候,主动释放程序占用的资源信息,释放db连接池的连接等其他占用的资源信息。 如果我们是 Spring 项目其实我们不用自己定义钩子函数,我们只要使用Spring提供给我们的销毁方法即可。因为 Spring定义的钩子函数中会去执行, DisposableBean.destory() 和被 PreDestroy 修饰的方法。
doClose()方法会执行bean的destroy(),也会执行SmartLifeCycle的stop()方法,我们就可以通过重写这些方法来实现对象的关闭,生命周期的管理,实现平滑shutdown。