当前位置:   article > 正文

Spring Bean 加载的执行顺序 InitializingBean 接口 @PostConstruct 注解 执行顺序 DisposableBean 接口 @PreDestroy 注解 执行顺序_initializingbean 顺序

initializingbean 顺序

Spring Bean 加载的执行顺序 InitializingBean 接口 @PostConstruct 注解 执行顺序 DisposableBean 接口 @PreDestroy 注解 执行顺序

一、概述

        在Spring框架中,bean在加载、销毁时,都可以执行特定的方法,来实现某些功能的增强、信息的记录。

        bean在加载完成后,可以通过 InitializingBean 接口 、 @PostConstruct 注解 、@Bean 注解的 initMethod 方法 ,这三种方式 实现相关功能的增强。

        bean在销毁时,可以通过 DisposableBean 接口、 @PreDestroy 注解 、@Bean 注解的 destroyMethod 方法 ,这三种方式 实现销毁前的回调,如:线程池资源关闭。

        那么问题来了: bean在加载、销毁时,这三种方法的执行顺序是如何呢?本文将以代码的形式,记录验证过程。

二、代码理解

        1、理解 bean 加载 和 InitializingBean 接口方法执行顺序

  1. @Component
  2. public class Animal {
  3. public Animal(){
  4. System.out.println("Animal 构造方法运行~");
  5. }
  6. @Bean
  7. public InitializingBean initializingBean(){
  8. return ()->{
  9. System.out.println("Animal initializingBean 方法执行 ~~");
  10. };
  11. }
  12. }

        1.1、输出结果:

  1. Animal 构造方法运行~
  2. Animal initializingBean 方法执行 ~~

        1.2、结论:构造方法先执行 ; initializingBean 方法后执行

        2、比较 @PostConstruct 注解 / InitializingBean 接口 /@Bean 注解的 initMethod 方法 执行顺序

  1. public class BeanStart implements InitializingBean {
  2. public void hehe(){
  3. System.out.println("hehe method ===>> @Bean 注解的 initMethod "+this);
  4. }
  5. @Override
  6. public void afterPropertiesSet() throws Exception {
  7. System.out.println("afterPropertiesSet method ===>> InitializingBean 接口方法");
  8. }
  9. @PostConstruct
  10. public void haha(){
  11. System.out.println("haha method ===>> @PostConstruct 注解" + this);
  12. }
  13. public BeanStart(){
  14. System.out.println("BeanStart 实例化完成后 ===>>> ");
  15. }
  16. }

        2.1、输出结果:

  1. BeanStart 实例化完成后 ===>>>
  2. haha method ===>> @PostConstruct 注解com.runcode.springboottourist.bean.BeanStart@7d44a19
  3. afterPropertiesSet method ===>> InitializingBean 接口方法
  4. hehe method ===>> @Bean 注解的 initMethod com.runcode.springboottourist.bean.BeanStart@7d44a19

        2.2、结论:@PostConstruct 注解最先执行 、 InitializingBean 接口方法 次之 、 @Bean 注解的 initMethod 方法最后执行

        3、比较 @PreDestroy 注解 / DisposableBean 接口 /@Bean 注解的 destroyMethod 方法 执行顺序

  1. public class BeanDestory implements DisposableBean {
  2. @Override
  3. public void destroy() throws Exception {
  4. System.out.println(" DisposableBean 接口的 destroy 方法执行 ~");
  5. }
  6. @PreDestroy
  7. public void overHaHa(){
  8. System.out.println("@PreDestroy 注解 方法执行 ~ overHaHa");
  9. }
  10. public void beanDestory(){
  11. System.out.println("@Bean 注解的 destroyMethod 方法执行 ~ beanDestory");
  12. }
  13. }

        3.1、输出结果:

  1. @Bean 注解的 destroyMethod 方法执行 ~ beanDestory
  2. @PreDestroy 注解 方法执行 ~ overHaHa
  3. DisposableBean 接口的 destroy 方法执行 ~

        3.2、结论:@PreDestroy 注解 最先执行 、DisposableBean 接口 次之 、 @Bean 注解的 destroyMethod 方法 最后执行

        4、上面的2个类:BeanStart 和 BeanDestory ,需要放一个配置类中,如下:

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. /**
  4. * Description: BeanConfig
  5. * @author wu
  6. * @version 1.0
  7. * @date 2022/9/19 23:04
  8. */
  9. @Configuration
  10. public class BeanConfig {
  11. /**
  12. * @Description: 演示bean初始化后,执行顺序
  13. * @return com.runcode.springboottourist.bean.BeanStart
  14. * @version v1.0
  15. * @author wu
  16. * @date 2022/9/19 23:09
  17. */
  18. @Bean(initMethod = "hehe")
  19. public BeanStart beanStart(){
  20. return new BeanStart();
  21. }
  22. /**
  23. * @Description: 演示 Bean销毁时,执行顺序
  24. * @return com.runcode.springboottourist.bean.BeanDestory
  25. * @version v1.0
  26. * @author wu
  27. * @date 2022/9/19 23:05
  28. */
  29. @Bean(destroyMethod = "beanDestory")
  30. public BeanDestory beanDestory(){
  31. return new BeanDestory();
  32. }
  33. }

三、总结

        1、类初始化过程中:构造方法 > initializingBean 接口

        2、类初始化先后顺序:@PostConstruct > InitializingBean > @Bean

        3、类销毁时先手顺序:@PreDestroy > DisposableBean > @Bean

        4、@PostConstruct 包路径是:javax.annotation.PostConstruct ; @PreDestroy 包路径是: javax.annotation.PreDestroy

        5、理解记忆:Java 注解 > Spring 接口 > Spring 注解

  1. Java 注解: @PostConstruct / @PreDestroy
  2. Spring 接口: InitializingBean / DisposableBean
  3. Spring 注解: @Bean (initMethod / destroyMethod)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/66361
推荐阅读
相关标签
  

闽ICP备14008679号