最后 遺留一個(gè)問(wèn)題,繼續(xù)探索中....
?
?
跟我學(xué)Spring3 學(xué)習(xí)筆記一
跟我學(xué)Spring3 學(xué)習(xí)筆記二
跟我學(xué)Spring3 學(xué)習(xí)筆記三
跟我學(xué)Spring3 學(xué)習(xí)筆記四
跟我學(xué)Spring3 學(xué)習(xí)筆記五 注入
跟我學(xué)Spring3 學(xué)習(xí)筆記六 注入
?
統(tǒng)一接口:
?
public interface HelloApi { public void sayHello(); }
?
?
一、延遲初始化:
?
/** * 延遲初始化Bean * 延遲初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用時(shí)才創(chuàng)建及初始化Bean。 * 配置方式很簡(jiǎn)單只需在<bean>標(biāo)簽上指定 “l(fā)azy-init” 屬性值為“true”即可延遲初始化Bean。 */ public class DiLazyInit implements HelloApi{ public void sayHello() { System.out.println("say DiInitDestory"); } public DiLazyInit(){ System.out.println("初始化 DiInitDestory"); } }
?
?
配置延遲初始化:
?
?
<!-- 延遲初始化Bean 延遲初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用時(shí)才創(chuàng)建及初始化Bean。 配置方式很簡(jiǎn)單只需在<bean>標(biāo)簽上指定 “l(fā)azy-init” 屬性值為“true”即可延遲初始化Bean。 --> <bean id="lazyinitDi" class="com.diinit.DiLazyInit" lazy-init="true"> </bean>
?
?junit 進(jìn)行測(cè)試:
?
@Test public void testLazyInit(){ ApplicationContext context = new ClassPathXmlApplicationContext("initdepends.xml"); HelloApi lazyInit = context.getBean("lazyinitDi",HelloApi.class); lazyInit.sayHello(); System.out.println(""); }?
?
注意這個(gè)時(shí)候的輸出結(jié)果:
?
?
初始化 DiLazyInit
say DiLazyInit
?
?
?
?
二、 可以指定初始化和銷(xiāo)毀的順序
?
?
/* 使用depends-on 是指 指定Bean初始化及銷(xiāo)毀時(shí)的順序,使用depends-on屬性指定的Bean要先初始化完畢 * 后才初始化當(dāng)前Bean,由于只有“singleton”Bean能被Spring管理銷(xiāo)毀,所以當(dāng)指定的Bean都是“singleton” * 時(shí),使用depends-on屬性指定的Bean要在指定的Bean之后銷(xiāo)毀。 * “decorator”指定了“depends-on”屬性為“l(fā)azyinitDi”,所以在“decorator”Bean初始化之前要先初 * 始化“l(fā)azyinitDi”,而在銷(xiāo)毀“l(fā)azyinitDi”之前先要銷(xiāo)毀“decorator”,大家注意一下銷(xiāo)毀順序,與文檔上的不符。 * “depends-on”屬性可以指定多個(gè)Bean,若指定多個(gè)Bean可以用“;”、“,”、空格分割。 * * 那“depends-on”有什么好處呢? * 主要是給出明確的初始化及銷(xiāo)毀順序,比如要初始化“decorator”時(shí)要確保“l(fā)azyinitDi”Bean的資源準(zhǔn)備好了, * 否則使用“decorator”時(shí)會(huì)看不到準(zhǔn)備的資源;而在銷(xiāo)毀時(shí)要先在“decorator”Bean的把對(duì)“helloApi”資源的引用釋 * 放掉才能銷(xiāo)毀“l(fā)azyinitDi”,否則可能銷(xiāo)毀 “l(fā)azyinitDi”時(shí)而“decorator”還保持著資源訪問(wèn),造成資源不能釋放或釋放錯(cuò)誤。 */ 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指定初始化和銷(xiāo)毀順序:
?
<!-- 初始化及銷(xiāo)毀時(shí)的順序 “decorator”指定了“depends-on”屬性為“l(fā)azyinitDi”,所以在“decorator”Bean初始化之前 要先初始化“l(fā)azyinitDi”,而在銷(xiāo)毀“l(fā)azyinitDi”之前先要銷(xiāo)毀“decorator”,大家注意一下銷(xiāo)毀順序 --> <bean id="decorator" class="com.diinit.ApiDecorator" depends-on="lazyinitDi"> <property name="helloApi"> <ref bean="lazyinitDi" /> </property> </bean>?
?
?
?junit 進(jìn)行測(cè)試:
?
@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(); }?
?
注意這個(gè)時(shí)候的輸出結(jié)果:
?
?
初始化 DiLazyInit
初始化 ApiDecorator ? ? ? ? ? ?//也是上面同樣的測(cè)試函數(shù) testLazyInit(),同樣的配置 ?這句是多打印出來(lái)的
say DiLazyInit
?
初始化 DiLazyInit
初始化 ApiDecorator
say ApiDecorator
say DiLazyInit
?
?
?
這突然多出來(lái)的打印結(jié)果,說(shuō)明進(jìn)行了ApiDecorator的對(duì)象的創(chuàng)建,
但是在第一個(gè)配置中也沒(méi)涉及到?ApiDecorator 類(lèi)的加載,注入 ?。
?
什么原因造成的呢?是一種隱藏的注入? 繼續(xù)探索中....
?
?
已有 1 人發(fā)表留言,猛擊->>這里<<-參與討論
ITeye推薦