局部钩子能防全局钩子吗_高级Java开发者都知道的Hook钩子函数,你还不知道吗?...

aa9a4fc397ac59f0ba7dfc939b07438b.png

什么是钩子函数,在学习钩子函数之前,小编先提一个面试问题。

请问在Spring中,如果JVM异常终止,Spring是如何保证会释放掉占用的资源,比如说数据库连接等资源呢?

钩子函数非常简单,简单到小编只用摘抄一段Spring代码即可。走你,现在开始。

Spring 容器中 Bean 在什么时候执行销毁方法?

我们知道在Spring中定义销毁方法有两种方式

  1. 实现 DisposableBean 的 destroy 方法。
  2. 使用 @PreDestroy 注解修饰方法
76b813220cb92fd37e7396962db7550d.png

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

c572b4c95d1be14aee1dd3f4b0f1ec7d.png
  • 主动执行销毁bean
a47ab8fe4a505e929b5876ccff619377.png
JVM关闭时候自动执行销毁方法。

这里就要用到钩子函数了, Spring 的钩子函数在 AbstractApplicationContext#shutdownHook属性。

如果我们是SpringBoot项目我们看到在SpringApplication启动时候会注册一个钩子函数

3089d7d2ac81d203741e162b550643f7.png

如何定义钩子函数?

简直太简单了,没有任何学习成本。一行代码就能搞定。

6e89923a67bd89d887e82a387bfc0012.png
17b679656a0c05f59d5a2cb1ebfdce99.png

触发钩子函数的场景

只要不是机器断电,强制kill -9 强制杀进程,都会触发。

8ae68afa2ce9c09da873184938ad790d.png

钩子函数能做什么?

60a4abf864bc8dc8edc1ce59b68f20b4.png

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

cedceb066ebed19ee6d7a8e4cf3204a5.png

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

ba8768ea8ef9762359e83456e3af48e3.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值