• Spring原理学习(五)初始化与销毁


    学习目标:

    1. Spring 提供了多种初始化和销毁手段
    2. 它们的执行顺序

    1、演示初始化销毁顺序

    主程序类

    1. @SpringBootApplication
    2. public class A07Application_1 {
    3. public static void main(String[] args) {
    4. ConfigurableApplicationContext context = SpringApplication.run(A07Application_1.class, args);
    5. context.close();
    6. }
    7. @Bean(initMethod = "init3")
    8. public Bean1 bean1() {
    9. return new Bean1();
    10. }
    11. @Bean(destroyMethod = "destroy3")
    12. public Bean2 bean2() {
    13. return new Bean2();
    14. }
    15. }

    Bean1类

    1. public class Bean1 implements InitializingBean {
    2. private static final Logger log = LoggerFactory.getLogger(Bean1.class);
    3. @PostConstruct
    4. public void init1() {
    5. log.debug("初始化1");
    6. }
    7. @Override
    8. public void afterPropertiesSet() throws Exception {
    9. log.debug("初始化2");
    10. }
    11. public void init3() {
    12. log.debug("初始化3");
    13. }
    14. }

    Bean2类

    1. public class Bean2 implements DisposableBean {
    2. private static final Logger log = LoggerFactory.getLogger(Bean2.class);
    3. @PreDestroy
    4. public void destroy1() {
    5. log.debug("销毁1");
    6. }
    7. @Override
    8. public void destroy() throws Exception {
    9. log.debug("销毁2");
    10. }
    11. public void destroy3() {
    12. log.debug("销毁3");
    13. }
    14. }

     结果:

    1. [main] com.itheima.a07.Bean1 - 初始化1
    2. [main] com.itheima.a07.Bean1 - 初始化2
    3. [main] com.itheima.a07.Bean1 - 初始化3
    4. [main] com.itheima.a07.Bean2 - 销毁1
    5. [main] com.itheima.a07.Bean2 - 销毁2
    6. [main] com.itheima.a07.Bean2 - 销毁3

    总结: 

    Spring 提供了多种初始化手段, @PostConstruct,@Bean(initMethod) 以及实现 InitializingBean 接口来进行初始化,如果同一个 bean 用了以上手段声明了 3 个初始化方法,那么它们的执行顺序是:

    1. @PostConstruct 标注的初始化方法

    2. InitializingBean 接口的初始化方法

    3. @Bean(initMethod) 指定的初始化方法

    与初始化类似,Spring 也提供了多种销毁手段,执行顺序为

    1. @PreDestroy 标注的销毁方法

    2. DisposableBean 接口的销毁方法

    3. @Bean(destroyMethod) 指定的销毁方法

    2、销毁单例之后,会创建新的单例

    1. public class A07Application_2 {
    2. public static void main(String[] args) {
    3. DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
    4. beanFactory.registerBeanDefinition(
    5. "myBean",
    6. BeanDefinitionBuilder.genericBeanDefinition(MyBean.class)
    7. .setDestroyMethodName("destroy")
    8. .getBeanDefinition()
    9. );
    10. System.out.println(beanFactory.getBean(MyBean.class));
    11. beanFactory.destroySingletons(); // 销毁之后, 仍可创建新的单例
    12. System.out.println(beanFactory.getBean(MyBean.class));
    13. }
    14. static class MyBean {
    15. public MyBean() {
    16. System.out.println("MyBean()");
    17. }
    18. public void destroy() {
    19. System.out.println("destroy()");
    20. }
    21. }
    22. }

    结果:

    1. MyBean()
    2. com.itheima.a07.A07Application_2$MyBean@7b98f307
    3. destroy()
    4. MyBean()
    5. com.itheima.a07.A07Application_2$MyBean@41d477ed

  • 相关阅读:
    redis 配置与优化
    算法通过村第七关-树(递归/二叉树遍历)青铜笔记|手撕递归
    证件照分辨率350dpi怎么调?怎么调照片dpi?
    TensorFlow Lite 是什么?用 TensorFlow Lite 来转换模型(附代码)
    MySQL主从同步延迟解决方案
    【总线】AXI总线:FPGA设计中的通信骨干
    2022年第十三届蓝桥杯软件类决赛C/C++大学B组题解
    (Note)阿克西斯ACASIS DT-3608双盘位硬盘阵列盒RAID设置
    [SWPUCTF 2021 新生赛]crypto2
    (ubuntu)安装nginx
  • 原文地址:https://blog.csdn.net/qq_51409098/article/details/127677022