• Spring Bean 生命周期之destroy——终极信仰


    上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁?我从哪里来? 的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去?

    初始化 Spring Bean 有三种方式:

    1. @PostConstruct
    2. InitializingBean.afterPropertiesSet()
    3. init-method

    销毁 Spring Bean 同样有三种方式:

    1. @PreDestroy
    2. DisposableBean.destroy()
    3. 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 的销毁方式也是可以组合使用的,那么组合在一起的调用顺序是什么呢?

    1. 首先 @PreDestroy 会被调用
    2. 其次 DisposableBean.destroy() 会被调用
    3. 最后调用通过 XML 配置的 destroy-method 方法或通过设置 @Bean 注解 设置 destroyMethod 属性的方法

    用图示来说明一下调用顺序

    这个调用顺序也不难记忆

    PreDestroy (P),destroy (D),destroy-method (D) ---> PDD (那个3亿人都在 pin 的那个 APP 名称,目前 3 亿人中没有我)

    再来看看 Spring Bean 生命周期图,我们已经点亮了核心部分:

    我们要注意,在销毁的过程并没有类似 BeanPostProcess 那中切面的思想,这里要注意到区别。

    灵魂追问

    1. 在阅读框架源码时,哪些地方用到了 bean 的销毁方法?
    2. 还没有被点亮的地方,你认为还有哪些内容没有做?

    提高效率工具


    推荐阅读


    欢迎持续关注公众号:「日拱一兵」

    • 前沿 Java 技术干货分享
    • 高效工具汇总
    • 面试问题分析与解答
    • 技术资料领取

    后续会出一系列文章点亮上图,同时进行 Spring 知识点解释与串联,在工作中充分利用 Spring 的特性
    另外,还会推出 Java 多线程与 ElasticSearch 相关内容

    持续关注,带你像读侦探小说一样轻松趣味学习 Java 技术栈相关知识

  • 相关阅读:
    Java发送HTTP的Get 和 Post请求
    vue 中使用 Ant Design 依次提供了三级选项卡
    Postman中不为人知的秘密 之 设置全局变量,token
    vue组件之间传值(03)__兄弟组件传值,事件总线[ EventBus ]
    元素内部滚动到底部和顶部的监听
    如何将三个数的颜色色值兼容成六个数的方法
    前端内容的自动化构建
    模拟vue实现简单的webpack打包
    VXcode学习
    npm install 成功安装依赖后,运行跑不起来怎么办?
  • 原文地址:https://www.cnblogs.com/FraserYu/p/11171341.html
Copyright © 2020-2023  润新知