sblig

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            10 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

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

          ?

          ?

          跟我學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推薦



          posted on 2012-10-18 16:45 李凡 閱讀(165) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 行唐县| 林甸县| 德庆县| 收藏| 兴宁市| 交口县| 惠东县| 永顺县| 合阳县| 任丘市| 聊城市| 凤庆县| 和田市| 承德市| 丰台区| 侯马市| 时尚| 临洮县| 长白| 茂名市| 华安县| 藁城市| 涟源市| 长宁区| 区。| 沙洋县| 朝阳市| 腾冲县| 兰西县| 沙湾县| 常熟市| 全州县| 大城县| 西峡县| 峨山| 莆田市| 灌阳县| 黄大仙区| 海安县| 寿宁县| 东乡县|