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

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

游戏|数码彩彩2024-06-10 7:38:01341A+A-

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

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

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

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

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

  1. 实现 DisposableBean 的 destroy 方法。
  2. 使用 @PreDestroy 注解修饰方法
高级Java开发者都知道的Hook钩子函数,你还不知道吗?

 

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

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

 

  • 主动执行销毁bean
高级Java开发者都知道的Hook钩子函数,你还不知道吗?

 

  • JVM关闭时候自动执行销毁方法。

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

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

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

 

如何定义钩子函数?

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

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

 


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

 

触发钩子函数的场景

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

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

 

钩子函数能做什么?

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

 

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

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

 

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

点击这里复制本文地址 版权声明:本文内容由网友提供,该文观点仅代表作者本人。本站(https://www.angyang.net.cn)仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

昂扬百科 © All Rights Reserved.  渝ICP备2023000803号-3网赚杂谈