前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Bean 生命周期之“我要到哪里去”?

Spring Bean 生命周期之“我要到哪里去”?

作者头像
二哥聊运营工具
发布2021-12-17 13:47:34
3250
发布2021-12-17 13:47:34
举报
文章被收录于专栏:程序员泥瓦匠

上一篇文章 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 方法时,这些销毁方法就会被触发,但一般正常的业务中很少会用到这些方法

代码语言:javascript
复制
public class MainApp {
   public static void main(String[] args) {
      AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

      HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
      obj.getMessage();
      context.registerShutdownHook();
   }
}

接下来具体的展示一下三种方法的使用方式

三种销毁 Spring Bean 的方式

DisposableBean

Spring 为我们提供了 DisposableBean 接口

代码语言:javascript
复制
public interface DisposableBean {
    void destroy() throws Exception;
}

我们可以通过实现 DisposableBean 接口,在其唯一方法 destroy 内完成 bean 销毁的工作,但是 Spring Framework 官方并不建议我们通过这种方法来销毁 bean,这同样是一种强耦合的方式,我们看到框架层面才会用到这个方法。

@PreDestroy

这种方式是 Spring 非常提倡的一种方式,我们通常将其标记在方法上即可,通常习惯将这个方法起名为 destory()

代码语言:javascript
复制
@PreDestroy
    public void destroy() {
        System.out.println("inside destroy() method");        
    }
}

destroy-method

同样是两种方式,第一种方式:

代码语言:javascript
复制
public class MyClass {
   public void destory() {
      // perform destroy logic here
   }
}

@Configuration
public class AppConfig {
   @Bean(destroyMethod = "destroy")
   public MyClass myclass() {
      return new MyClass ();
   }
}

第二种方式

代码语言:javascript
复制
<bean id="myClass" class="com.demo.MyClass" destory-method="destory"/>

以上三种 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. 还没有被点亮的地方,你认为还有哪些内容没有做?

带着疑问去思考,然后串联,进而归纳总结,不断追问自己,进行自我辩证,像侦查嫌疑案件一样看待技术问题,漆黑的街道,你我一起寻找线索,你就是技术界大侦探福尔摩斯

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员泥瓦匠 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 三种销毁 Spring Bean 的方式
    • DisposableBean
      • @PreDestroy
        • destroy-method
        • 灵魂追问
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档