Spring第八篇:容器中bean對象的創建順序


  一、無依賴bean的創建和銷毀順序

  Spring的org.springframework.beans.factory.DisposableBean接口中存在destroy()方法,當我們的調用容器的close()方法會調用所有bean的destroy()方法來做相應的處理。

  創建無依賴bean的class文件。

public class NoDependBean {

    public static class Bean1 implements DisposableBean{

        public Bean1() {
            System.out.println(this.getClass() + "constructor!");
        }

        @Override
        public void destroy() throws Exception {
            System.out.println(this.getClass() + "destroy()");
        }
    }

    public static class  Bean2 implements DisposableBean{

        public Bean2() {
            System.out.println(this.getClass() + "constructor!");
        }

        @Override
        public void destroy() throws Exception {
            System.out.println(this.getClass() + "destroy()");
        }
    }

    public static class Bean3 implements DisposableBean{

        public Bean3(){
            System.out.println(this.getClass() + "constructor!");
        }

        @Override
        public void destroy() throws Exception {
            System.out.println(this.getClass() + "destroy()");
        }
    }

}

  test方法運行結果:從運行結果可以看出,無依賴bean創建順序以xml文件中的配置順序一致,銷毀順序則是xml配置文件的倒敘。

class com.java.spring01.demo6.NoDependBean$Bean3constructor!
class com.java.spring01.demo6.NoDependBean$Bean2constructor!
class com.java.spring01.demo6.NoDependBean$Bean1constructor!
class com.java.spring01.demo6.NoDependBean$Bean1destroy()
class com.java.spring01.demo6.NoDependBean$Bean2destroy()
class com.java.spring01.demo6.NoDependBean$Bean3destroy()

  二、通過構造器強依賴的bean創建和銷毀

  class文件

public class StrongDependBean {
    public static class Bean1 implements DisposableBean{

        public Bean1() {
            System.out.println(this.getClass() + "constructor!");
        }

        @Override
        public void destroy() throws Exception {
            System.out.println(this.getClass() + "destroy()");
        }
    }

    public static class  Bean2 implements DisposableBean{
        private Bean1 bean1;
        public Bean2(Bean1 bean1) {
            this.bean1 = bean1;
            System.out.println(this.getClass() + "constructor!");
        }

        public Bean2() {
        }

        @Override
        public void destroy() throws Exception {
            System.out.println(this.getClass() + "destroy()");
        }
    }

    public static class Bean3 implements DisposableBean {

        private Bean2 bean2;

        public Bean3(Bean2 bean2){
            this.bean2 = bean2;
            System.out.println(this.getClass() + "constructor!");
        }

        public Bean3() {
        }

        @Override
        public void destroy() throws Exception {
            System.out.println(this.getClass() + "destroy()");
        }
    }

}

  bean.xml文件增加配置

<!--強依賴對象創建-->
    <bean id = "bean3" class="com.java.spring01.demo6.StrongDependBean.Bean3" autowire="constructor"/>
    <bean id = "bean2" class="com.java.spring01.demo6.StrongDependBean.Bean2" autowire="constructor"/>
    <bean id = "bean1" class="com.java.spring01.demo6.StrongDependBean.Bean1"/>

  test方法運行結果

class com.java.spring01.demo6.StrongDependBean$Bean1constructor!
class com.java.spring01.demo6.StrongDependBean$Bean2constructor!
class com.java.spring01.demo6.StrongDependBean$Bean3constructor!
class com.java.spring01.demo6.StrongDependBean$Bean3destroy()
class com.java.spring01.demo6.StrongDependBean$Bean2destroy()
class com.java.spring01.demo6.StrongDependBean$Bean1destroy()

  強依賴的創建順序同依賴一致,銷毀同依賴關系相反。

  三、使用depend-on干擾bean的創建和銷毀

<bean id="bean1" class="" depend-on="bean2,bean3; bean4" />

  depend-on用來定義創建當前的bean之前,需要先創建好哪些bean對象。銷毀的時候會先此處id的bean對象,然后再去銷毀依賴的bean對象。

  在無依賴的bean.xml中添加depend-on屬性指定創建屬性,來查看bean的創建和銷毀。修改bean.xml文件增加depend-on屬性。

<bean id = "bean3" class="com.java.spring01.demo6.NoDependBean.Bean3" depends-on="bean1 bean2"/>
    <bean id = "bean2" class="com.java.spring01.demo6.NoDependBean.Bean2"/>
    <bean id = "bean1" class="com.java.spring01.demo6.NoDependBean.Bean1"/>

  運行test方法,查看運行結果。

class com.java.spring01.demo6.NoDependBean$Bean1constructor!
class com.java.spring01.demo6.NoDependBean$Bean2constructor!
class com.java.spring01.demo6.NoDependBean$Bean3constructor!
class com.java.spring01.demo6.NoDependBean$Bean3destroy()
class com.java.spring01.demo6.NoDependBean$Bean2destroy()
class com.java.spring01.demo6.NoDependBean$Bean1destroy()

總結

  1. 無依賴的bean創建順序和定義的順序一致,銷毀順序剛好相反

  2. 通過構造器強依賴的bean,會先創建構造器參數中對應的bean,然后才會創建當前bean,銷毀順序剛好相反

  3. depend-on可以指定檔期bean依賴的bean,通過這個可以確保depend-on指定的bean在當前bean創建之前先創建好,銷毀順序剛好相反

  4. bean的銷毀順序和bean創建的順序相反

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM