spring的钩子_高级Java开发者都知道的Hook钩子函数,你还不知道吗?

2574c8d44e45de176488a503c51aa9c5.png

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

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

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

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

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

实现 DisposableBean 的 destroy 方法。使用 @PreDestroy 注解修饰方法

904edfc47e6ede23312632cefa20f211.png

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

b9d9694c2366b819ae11737280a3ac2d.png

主动执行销毁bean

7559c74935c4574ad318968a11c091c9.png

JVM关闭时候自动执行销毁方法。这里就要用到钩子函数了, Spring 的钩子函数在 AbstractApplicationContext#shutdownHook属性。

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

1ecae28746297251c069ba5d68b7ba11.png

如何定义钩子函数?

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

4c042e7af3956bcc1c4e9adca7361c1e.png

2b858a873b3bd425e3b92c435461d1e8.png

触发钩子函数的场景

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

3184488857013c24ad53f404662bf7e2.png

钩子函数能做什么?

42fe43e44bea1ca17dd255c43c56bf6a.png

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

261f84ecb207d9848ee3f661e02848dc.png

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

2ed6544cb146a25b9c79362c10f20153.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值