高级Java开发者都知道的Hook钩子函数,你还不知道吗?
2023-06-22 来源:飞速影视

什么是钩子函数,在学习钩子函数之前,小编先提一个面试问题。
请问在Spring中,如果JVM异常终止,Spring是如何保证会释放掉占用的资源,比如说数据库连接等资源呢?
钩子函数非常简单,简单到小编只用摘抄一段Spring代码即可。走你,现在开始。
Spring 容器中 Bean 在什么时候执行销毁方法?
我们知道在Spring中定义销毁方法有两种方式
实现 DisposableBean 的 destroy 方法。使用 @PreDestroy 注解修饰方法

那么在什么时候执行销毁方法?

主动执行销毁bean

JVM关闭时候自动执行销毁方法。这里就要用到钩子函数了, Spring 的钩子函数在 AbstractApplicationContext#shutdownHook属性。
如果我们是SpringBoot项目我们看到在SpringApplication启动时候会注册一个钩子函数

如何定义钩子函数?
简直太简单了,没有任何学习成本。一行代码就能搞定。


触发钩子函数的场景
只要不是机器断电,强制kill -9 强制杀进程,都会触发。

钩子函数能做什么?

正如上图所示优雅停机,在项目将要关闭时候,主动释放程序占用的资源信息,释放db连接池的连接等其他占用的资源信息。 如果我们是 Spring 项目其实我们不用自己定义钩子函数,我们只要使用Spring提供给我们的销毁方法即可。因为 Spring定义的钩子函数中会去执行, DisposableBean.destory() 和被 PreDestroy 修饰的方法。

doClose()方法会执行bean的destroy(),也会执行SmartLifeCycle的stop()方法,我们就可以通过重写这些方法来实现对象的关闭,生命周期的管理,实现平滑shutdown。

本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)
www.fs94.org-飞速影视 粤ICP备74369512号