一、無依賴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()
總結
-
無依賴的bean創建順序和定義的順序一致,銷毀順序剛好相反
-
通過構造器強依賴的bean,會先創建構造器參數中對應的bean,然后才會創建當前bean,銷毀順序剛好相反
-
depend-on可以指定檔期bean依賴的bean,通過這個可以確保depend-on指定的bean在當前bean創建之前先創建好,銷毀順序剛好相反
-
bean的銷毀順序和bean創建的順序相反