ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring系列6:depends-on干预bean创建和销毁顺序

2022-01-26 08:32:30  阅读:184  来源: 互联网

标签:初始化 销毁 Spring depends bean ----- println public


本文内容

  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

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

标签:初始化,销毁,Spring,depends,bean,-----,println,public
来源: https://www.cnblogs.com/kongbubihai/p/15845338.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有