1. 程式人生 > >跟我學Spring3 學習筆記七 初始化與銷燬

跟我學Spring3 學習筆記七 初始化與銷燬

最後 遺留一個問題,繼續探索中....

統一介面:

public interface HelloApi {
	public void sayHello();  
}

一、延遲初始化:

/**
 * 延遲初始化Bean
 *     延遲初始化也叫做惰性初始化,指不提前初始化Bean,而是隻有在真正使用時才建立及初始化Bean。
 *     配置方式很簡單隻需在<bean>標籤上指定 “lazy-init” 屬性值為“true”即可延遲初始化Bean。
 */
public class DiLazyInit implements HelloApi{

	public void sayHello() {
		System.out.println("say DiInitDestory");
	}
	
	public DiLazyInit(){
		System.out.println("初始化 DiInitDestory");
	}
}

配置延遲初始化:

<!-- 延遲初始化Bean 
	     延遲初始化也叫做惰性初始化,指不提前初始化Bean,而是隻有在真正使用時才建立及初始化Bean。
	     配置方式很簡單隻需在<bean>標籤上指定 “lazy-init” 屬性值為“true”即可延遲初始化Bean。 -->
	<bean id="lazyinitDi" class="com.diinit.DiLazyInit"
		lazy-init="true">
	</bean>

 junit 進行測試:

@Test
	public void testLazyInit(){
		ApplicationContext context = new ClassPathXmlApplicationContext("initdepends.xml");
		HelloApi lazyInit = context.getBean("lazyinitDi",HelloApi.class);
		lazyInit.sayHello();
		System.out.println("");
	}

注意這個時候的輸出結果:

初始化 DiLazyInit

say DiLazyInit

二、 可以指定初始化和銷燬的順序

/* 使用depends-on 是指 指定Bean初始化及銷燬時的順序,使用depends-on屬性指定的Bean要先初始化完畢
*     後才初始化當前Bean,由於只有“singleton”Bean能被Spring管理銷燬,所以當指定的Bean都是“singleton”
*     時,使用depends-on屬性指定的Bean要在指定的Bean之後銷燬。
*     “decorator”指定了“depends-on”屬性為“lazyinitDi”,所以在“decorator”Bean初始化之前要先初
*     始化“lazyinitDi”,而在銷燬“lazyinitDi”之前先要銷燬“decorator”,大家注意一下銷燬順序,與文件上的不符。
*     “depends-on”屬性可以指定多個Bean,若指定多個Bean可以用“;”、“,”、空格分割。
*     
*  那“depends-on”有什麼好處呢?
*     主要是給出明確的初始化及銷燬順序,比如要初始化“decorator”時要確保“lazyinitDi”Bean的資源準備好了,
*     否則使用“decorator”時會看不到準備的資源;而在銷燬時要先在“decorator”Bean的把對“helloApi”資源的引用釋
*     放掉才能銷燬“lazyinitDi”,否則可能銷燬 “lazyinitDi”時而“decorator”還保持著資源訪問,造成資源不能釋放或釋放錯誤。
*/
public class ApiDecorator implements HelloApi{

	private HelloApi helloApi;
	
	public ApiDecorator(){
		System.out.println("初始化 ApiDecorator");
	}
	
	public void sayHello() {
		System.out.println("say ApiDecorator");
		helloApi.sayHello();
		
	}

	public HelloApi getHelloApi() {
		return helloApi;
	}

	public void setHelloApi(HelloApi helloApi) {
		this.helloApi = helloApi;
	}
}

配置xml指定初始化和銷燬順序:

<!-- 初始化及銷燬時的順序    
	     “decorator”指定了“depends-on”屬性為“lazyinitDi”,所以在“decorator”Bean初始化之前
	     要先初始化“lazyinitDi”,而在銷燬“lazyinitDi”之前先要銷燬“decorator”,大家注意一下銷燬順序 -->
	<bean id="decorator" class="com.diinit.ApiDecorator"
		depends-on="lazyinitDi">
		<property name="helloApi">
			<ref bean="lazyinitDi" />
		</property>
	</bean>

 junit 進行測試:

@Test
	public void testLazyInit(){
		ApplicationContext context = new ClassPathXmlApplicationContext("initdepends.xml");
		HelloApi lazyInit = context.getBean("lazyinitDi",HelloApi.class);
		lazyInit.sayHello();
		System.out.println("");
	}
	
	@Test
	public void testDependsOn(){
		ApplicationContext context= new ClassPathXmlApplicationContext("initdepends.xml");
		HelloApi depends = context.getBean("decorator",HelloApi.class);
		depends.sayHello();
	}

注意這個時候的輸出結果:

初始化 DiLazyInit

初始化 ApiDecorator            //也是上面同樣的測試函式 testLazyInit(),同樣的配置  這句是多打印出來的

say DiLazyInit

初始化 DiLazyInit

初始化 ApiDecorator

say ApiDecorator

say DiLazyInit

這突然多出來的列印結果,說明進行了ApiDecorator的物件的建立,

但是在第一個配置中也沒涉及到 ApiDecorator 類的載入,注入  。

什麼原因造成的呢?是一種隱藏的注入? 繼續探索中....

1 樓 sblig 2012-10-19   引用刪除 問題已經找到,是自己的問題

depends-on="lazyinitDi" 這個去掉

輸出的結果就變了

初始化 ApiDecorator   使用lazy-init屬性Spring對Bean進行了預初始化
初始化 DiLazyInit          
say DiLazyInit


初始化 DiLazyInit
初始化 ApiDecorator
say ApiDecorator
say DiLazyInit