Spring系列6:depends-on干預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="//www.springframework.org/schema/beans"
       xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="//www.springframework.org/schema/beans //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="//www.springframework.org/schema/beans"
       xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="//www.springframework.org/schema/beans //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的初始化和銷毀的影響和實際的應用場景。下一篇介紹自動依賴注入。

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

知識分享,轉載請註明出處。學無先後,達者為先!

Tags: