• Spring系列6:dependson干预bean创建和销毁顺序


    本文内容

    1. 不使用depends-onbean的初始化和销毁顺序
    2. 使用depends-on后bean的初始化和销毁顺序
    3. depends-on结论和应用场景

    结论先上

    初始化: depends-on 属性可以显式地强制一个或多个 bean 在使用这个元素的 bean 被初始化之前被初始化。

    销毁:depends-on 属性指定的那些依赖bean先销毁,使用这个元素的 bean后被销毁,干预了关闭顺序。

    结论给完了,我们下面通过案例验证。

    不使用depends-onbean的初始化和销毁顺序

    定义3个简单类,包含initdestroy方法,用于观察顺序

    public class MyBeanA {
        public void init() {
            System.out.println("MyBeanA 被初始化-----");
        }
        public void destroy() {
            System.out.println("MyBeanA 被销毁-----");
        }
    }
    public class MyBeanB {
        public void init() {
            System.out.println("MyBeanB 被初始化-----");
        }
        public void destroy() {
            System.out.println("MyBeanB 被销毁-----");
        }
    }
    public class MyBeanC {
        public void init() {
            System.out.println("MyBeanC 被初始化-----");
        }
        public void destroy() {
            System.out.println("MyBeanC 被销毁-----");
        }
    }
    

    配置中bean定义并指定初始化方法和销毁方法

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean class="com.crab.spring.ioc.demo04.MyBeanA" init-method="init" destroy-method="destroy" id="myBeanA"/>
        <bean class="com.crab.spring.ioc.demo04.MyBeanB" init-method="init" destroy-method="destroy" id="myBeanB"/>
        <bean class="com.crab.spring.ioc.demo04.MyBeanC" init-method="init" destroy-method="destroy" id="myBeanC"/>
    
    </beans>
    

    测试容器对bean的初始化和销毁

    package com.crab.spring.ioc.demo04;
    
    /**
     * @author zfd
     * @version v1.0
     * @date 2022/1/13 15:11
     * @关于我 请关注公众号 螃蟹的Java笔记 获取更多技术系列
     */
    public class Test {
    
        @org.junit.Test
        public void test() {
            System.out.println("开始创建容器并初始化bean");
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("demo04/spring1.xml");
            System.out.println("开始关闭容器并销毁bean");
            context.close();
        }
    }
    

    本阶段结论

    输出结果

    开始创建容器并初始化bean
    MyBeanA 被初始化-----
    MyBeanB 被初始化-----
    MyBeanC 被初始化-----
    开始关闭容器并销毁bean
    MyBeanC 被销毁-----
    MyBeanB 被销毁-----
    MyBeanA 被销毁-----
    

    初始化的顺序是bean在配置文件中的配置顺序A-B-C

    销毁的顺序与初始化顺序相反C-B-A

    使用depends-on后bean的初始化和销毁顺序

    在上面案例的基础上,调整MyBeanA的配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean class="com.crab.spring.ioc.demo04.MyBeanA" init-method="init" destroy-method="destroy" id="myBeanA" depends-on="myBeanC"/>
        <bean class="com.crab.spring.ioc.demo04.MyBeanB" init-method="init" destroy-method="destroy" id="myBeanB"/>
        <bean class="com.crab.spring.ioc.demo04.MyBeanC" init-method="init" destroy-method="destroy" id="myBeanC"/>
    </beans>
    

    测试程序一样,指定配置文件

        @org.junit.Test
        public void test2() {
            System.out.println("开始创建容器并初始化bean");
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("demo04/spring2.xml");
            System.out.println("开始关闭容器并销毁bean");
            context.close();
        }
    

    本阶段结论

    运行结果

    开始创建容器并初始化bean
    MyBeanC 被初始化-----
    MyBeanA 被初始化-----
    MyBeanB 被初始化-----
    开始关闭容器并销毁bean
    MyBeanB 被销毁-----
    MyBeanA 被销毁-----
    MyBeanC 被销毁-----
    

    初始化的顺序:C-A-B,不同地方A依赖于C,所以C先初始化,然后到A,顺序再到B

    销毁的顺序:B-A-C,销毁A再销毁C

    depends-on结论和应用场景

    干预初始化:例如当需要触发类中的静态初始化方法来注册数据库驱动程序时候,是依赖于数据库的配置bean先初始化的。

    干预销毁:例如我们的清理类A中在销毁方法中保存进程中某些数据到redis,依赖于RedisTemplate,则RedisTemplate必须在A之后销毁。

    总结

    本文介绍各种介绍了depends-on对bean的初始化和销毁的影响和实际的应用场景。下一篇介绍自动依赖注入。

    本篇源码地址: https://github.com/kongxubihai/pdf-spring-series/tree/main/spring-series-ioc/src/main/java/com/crab/spring/ioc/demo04

    知识分享,转载请注明出处。学无先后,达者为先!

  • 相关阅读:
    [leetcode-604-Design Compressed String Iterator]
    [leetcode-617-Merge Two Binary Trees]
    OpenCV学习1-----打开摄像头并在画面上添加水印
    cvCvtColor与cvtColor区别
    [leetcode-547-Friend Circles]
    [leetcode-260-Single Number III]
    复位电路
    单片机特殊功能寄存器
    单片机的定时器与计数器
    单片机定时/计数工作方式
  • 原文地址:https://www.cnblogs.com/kongbubihai/p/15845338.html
Copyright © 2020-2023  润新知