Spring Bean 生命周期之destroy——终极信仰
上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁?
和 我从哪里来?
的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去?
初始化 Spring Bean 有三种方式:
- @PostConstruct
- InitializingBean.afterPropertiesSet()
- init-method
销毁 Spring Bean 同样有三种方式:
- @PreDestroy
- DisposableBean.destroy()
- destroy-method
正所谓,天对地,雨对风; @PostConstruct 对 @PreDestroy;InitializingBean.afterPropertiesSet() 对 DisposableBean.destroy(); init-method 对 destroy-method;雷隐隐,雾蒙蒙;山花对海树,赤日对苍穹;平仄平仄平平仄,仄平仄平仄仄平,仄仄平……
感觉讲到这没必要讲下去了,一切清晰明了,但我还有话要说
当 Spring Ioc 容器要移除 bean 时,销毁相关回调方法将会被执行,这么做的目的时释放被 bean 持有的资源,或者去执行一些终极任务. 当 ApplicationContext 调用 registerShutdownHook 方法时,这些销毁方法就会被触发,但一般正常的业务中很少会用到这些方法
接下来具体的展示一下三种方法的使用方式
三种销毁 Spring Bean 的方式
DisposableBean
Spring 为我们提供了 DisposableBean 接口
我们可以通过实现 DisposableBean
接口,在其唯一方法 destroy
内完成 bean 销毁的工作,但是 Spring Framework 官方并不建议我们通过这种方法来销毁 bean,这同样是一种强耦合的方式,我们看到框架层面才会用到这个方法。
@PreDestroy
这种方式是 Spring 非常提倡的一种方式,我们通常将其标记在方法上即可,通常习惯将这个方法起名为 destory()
destroy-method
同样是两种方式,第一种方式:
第二种方式
以上三种 Bean 的销毁方式也是可以组合使用的,那么组合在一起的调用顺序是什么呢?
- 首先 @PreDestroy 会被调用
- 其次 DisposableBean.destroy() 会被调用
- 最后调用通过 XML 配置的 destroy-method 方法或通过设置 @Bean 注解 设置 destroyMethod 属性的方法
用图示来说明一下调用顺序
这个调用顺序也不难记忆
PreDestroy
(P)
,destroy(D)
,destroy-method(D)
--->PDD (那个3亿人都在 pin 的那个 APP 名称,目前 3 亿人中没有我)
再来看看 Spring Bean 生命周期图,我们已经点亮了核心部分:
我们要注意,在销毁的过程并没有类似 BeanPostProcess 那中切面的思想,这里要注意到区别。
灵魂追问
- 在阅读框架源码时,哪些地方用到了 bean 的销毁方法?
- 还没有被点亮的地方,你认为还有哪些内容没有做?
提高效率工具
推荐阅读
- 面试还不知道 BeanFactory 和 ApplicationContext 的区别?
- Spring Bean 生命周期之"我从哪里来?",懂得这个很重要
- Spring Bean 生命周期之"我要到哪里去?"
- 如何设计好的RESTful API
- 轻松高效玩转DTO(Data Transfer Object)
欢迎持续关注公众号:「日拱一兵」
- 前沿 Java 技术干货分享
- 高效工具汇总
- 面试问题分析与解答
- 技术资料领取
后续会出一系列文章点亮上图,同时进行 Spring 知识点解释与串联,在工作中充分利用 Spring 的特性
另外,还会推出 Java 多线程与 ElasticSearch 相关内容
持续关注,带你像读侦探小说一样轻松趣味学习 Java 技术栈相关知识
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了