• 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

  • 相关阅读:
    人工智能知识全面讲解:回归分析
    springboot蓝球场馆预约系统毕业设计-附源码211706
    23.Spring Cloud + Spring Boot + Mybatis + Uniapp分布式、微服务、云架构企业快速开发架构之Shell 函数
    科技与环卫的结合,是智慧公厕厂家的使命
    Mybatis关联关系映射
    Linux基础入门到精通之Linux系统配置IP
    SpringBoot整合Swagger3
    Redisson
    【MySQL学习】C++外部调用
    线路质检用的到底多不多?
  • 原文地址:https://blog.csdn.net/qq_51409098/article/details/127677022