最后 遺留一個問題,繼續探索中....
?
?
跟我學Spring3 學習筆記一
跟我學Spring3 學習筆記二
跟我學Spring3 學習筆記三
跟我學Spring3 學習筆記四
跟我學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 人發表留言,猛擊->>這里<<-參與討論
ITeye推薦