<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    sblig

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      10 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

    2012年10月18日 #

    最后 遺留一個(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

    ?

    ?

    ?

    ?

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

    ?

    ?

    /* 使用depends-on 是指 指定Bean初始化及銷毀時(shí)的順序,使用depends-on屬性指定的Bean要先初始化完畢
    *     后才初始化當(dāng)前Bean,由于只有“singleton”Bean能被Spring管理銷毀,所以當(dāng)指定的Bean都是“singleton”
    *     時(shí),使用depends-on屬性指定的Bean要在指定的Bean之后銷毀。
    *     “decorator”指定了“depends-on”屬性為“l(fā)azyinitDi”,所以在“decorator”Bean初始化之前要先初
    *     始化“l(fā)azyinitDi”,而在銷毀“l(fā)azyinitDi”之前先要銷毀“decorator”,大家注意一下銷毀順序,與文檔上的不符。
    *     “depends-on”屬性可以指定多個(gè)Bean,若指定多個(gè)Bean可以用“;”、“,”、空格分割。
    *     
    *  那“depends-on”有什么好處呢?
    *     主要是給出明確的初始化及銷毀順序,比如要初始化“decorator”時(shí)要確?!發(fā)azyinitDi”Bean的資源準(zhǔn)備好了,
    *     否則使用“decorator”時(shí)會(huì)看不到準(zhǔn)備的資源;而在銷毀時(shí)要先在“decorator”Bean的把對(duì)“helloApi”資源的引用釋
    *     放掉才能銷毀“l(fā)azyinitDi”,否則可能銷毀 “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指定初始化和銷毀順序:

    ?

    <!-- 初始化及銷毀時(shí)的順序    
    	     “decorator”指定了“depends-on”屬性為“l(fā)azyinitDi”,所以在“decorator”Bean初始化之前
    	     要先初始化“l(fā)azyinitDi”,而在銷毀“l(fā)azyinitDi”之前先要銷毀“decorator”,大家注意一下銷毀順序 -->
    	<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 類的加載,注入 ?。

    ?

    什么原因造成的呢?是一種隱藏的注入? 繼續(xù)探索中....

    ?

    ?



    已有 1 人發(fā)表留言,猛擊->>這里<<-參與討論


    ITeye推薦



    posted @ 2012-10-18 16:45 李凡 閱讀(164) | 評(píng)論 (0)編輯 收藏


    跟我學(xué)Spring3 學(xué)習(xí)筆記一

    跟我學(xué)Spring3 學(xué)習(xí)筆記二

    跟我學(xué)Spring3 學(xué)習(xí)筆記三

    跟我學(xué)Spring3 學(xué)習(xí)筆記四

    跟我學(xué)Spring3 學(xué)習(xí)筆記五 注入

    ?

    ?

    引用其它Bean

    ?

    一、構(gòu)造器注入方式:

    (1)通過(guò)” <constructor-arg>”標(biāo)簽的ref屬性來(lái)引用其他Bean

    ?

    (2)通過(guò)” <constructor-arg>”標(biāo)簽的子<ref>標(biāo)簽來(lái)引用其他Bean,使用bean屬性來(lái)指定引用的Bean

    二、setter注入方式:

    (1)通過(guò)” <property>”標(biāo)簽的ref屬性來(lái)引用其他Bean

    (2)通過(guò)” <property>”標(biāo)簽的子<ref>標(biāo)簽來(lái)引用其他Bean,使用bean屬性來(lái)指定引用的Bean

    ?

    ?

    public class HelloDiBean implements HelloApi{
    
    	private HelloApi helloApi;
    	private HelloApi helloApi2;
    	
    
    	public HelloDiBean(HelloApi helloApi){
    		this.helloApi = helloApi;
    	}
    	
    	public void sayHello() {
    		helloApi.sayHello();
    		helloApi2.sayHello();
    	}
    	
    
    	public HelloApi getHelloApi2() {
    		return helloApi2;
    	}
    
    	public void setHelloApi2(HelloApi helloApi2) {
    		this.helloApi2 = helloApi2;
    	}
    }
    

    ?配置注入引用其他的bean

    ?

    <!-- 引用其他的bean進(jìn)行注入 -->
    	<bean id="helloBean" class="com.dilist.HelloDiBean">
    		<constructor-arg index="0" ref="mapBean" />
    		<property name="helloApi2">
    			<ref bean="properBean" />
    		</property>
    	</bean>
    	
    ?

    其他引用bean 的高級(jí)用法:

    ?

    /**
     * Spring還提供了另外兩種更高級(jí)的配置方式,<ref local=””/>和<ref parent=””/>:
     * (1)<ref local=””/>配置方式:用于引用通過(guò)<bean id=”beanName”>方式中通過(guò)id屬性指定的Bean,
     * 		它能利用XML解析器的驗(yàn)證功能在讀取配置文件時(shí)來(lái)驗(yàn)證引用的Bean是否存在。
     * 		因此如果在當(dāng)前配置文件中有相互引用的Bean可以采用<ref local>方式從而如果配置錯(cuò)誤能在開(kāi)發(fā)調(diào)試時(shí)就發(fā)現(xiàn)錯(cuò)誤。
     * (2)<ref parent=””/>配置方式:用于引用父容器中的Bean,不會(huì)引用當(dāng)前容器中的Bean,
     *       當(dāng)然父容器中的Bean和當(dāng)前容器的Bean是可以重名的,獲取順序是直接到父容器找。
     */
    public class HelloHigh implements HelloApi{
    	
    	private HelloApi helloApi;
    	private HelloApi helloApi2;
    	
    
    	public HelloHigh(HelloApi helloApi){
    		this.helloApi = helloApi;
    	}
    	
    	public void sayHello() {
    		helloApi.sayHello();
    		System.out.println("");
    		helloApi2.sayHello();
    	}
    	
    
    	public HelloApi getHelloApi2() {
    		return helloApi2;
    	}
    
    	public void setHelloApi2(HelloApi helloApi2) {
    		this.helloApi2 = helloApi2;
    	}
    
    }
    ?

    helloworld.xml:

    ?

    <!-- 注入properties類型 -->
    	<bean id="properBean" class="com.dilist.HelloDiProperties">
    		<property name="properties">
    			<props value-type="int" merge="default"><!-- 雖然指定value-type,但是不起作用 -->
    				<prop key="1">1sss</prop>           <!-- Properties 建和值都是String類型 -->
    				<prop key="2">2</prop>
    			</props>
    		</property>
    		<property name="properties2">
    			<value> <!-- 分隔符可以是 “換行”、“;”、“,” 不建議該方式,優(yōu)先選擇第一種方式 -->
    				1=11
    				2=22;<!-- 這樣的分隔符好像沒(méi)用 -->
    			    3=33,
    				4=44
    			</value>
    		</property>
    	</bean>
    
    	<!-- Spring還提供了另外兩種更高級(jí)的配置方式,<ref local=””/>和<ref parent=””/> -->
    	<bean id="helloHigh" class="com.dilist.HelloHigh">
    		<constructor-arg index="0"><ref local="properBean" /></constructor-arg>
    		<property name="helloApi2"><ref parent="properBean" /></property>	
    	</bean>
    ?

    ?

    helloworldParent.xml:

    ?

    <!-- 注入properties類型 -->
    	<bean id="properBean" class="com.dilist.HelloDiProperties">
    		<property name="properties">
    			<props value-type="int" merge="default"><!-- 雖然指定value-type,但是不起作用 -->
    				<prop key="1">2dss</prop>           <!-- Properties 建和值都是String類型 -->
    				<prop key="2">3aas</prop>
    			</props>
    		</property>
    		<property name="properties2">
    			<value> <!-- 分隔符可以是 “換行”、“;”、“,” 不建議該方式,優(yōu)先選擇第一種方式 -->
    				1=111
    				2=222;<!-- 這樣的分隔符好像沒(méi)用 -->
    			    3=333,
    				4=444
    			</value>
    		</property>
    	</bean>
    ?

    調(diào)用處 利用加載父容器的方式,注入父容器中的Bean:

    ?

    ?

    @Test
    	public void testDiBeanHigh() {
    		// 以classes為根目錄算起
    		// 讀取配置文件實(shí)例化一個(gè)Ioc容器
    
    		// 初始化父容器
    		ApplicationContext parentContext = new ClassPathXmlApplicationContext(
    				"helloworldParent.xml");
    
    		// 初始化當(dāng)前容器
    		ApplicationContext context = new ClassPathXmlApplicationContext(
    				new String[] { "helloworld.xml" }, parentContext);
    
    		// 構(gòu)造 + setter注入 引用其他的bean注入
    		HelloApi helloApi = context.getBean("helloHigh", HelloApi.class);
    		helloApi.sayHello();
    
    	}


    已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


    ITeye推薦



    posted @ 2012-10-18 14:32 李凡 閱讀(147) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲AV无码专区日韩| 永久免费看bbb| 亚洲热线99精品视频| 国产免费伦精品一区二区三区| 亚洲精品国产福利一二区| 国产精品自拍亚洲| 亚洲男人的天堂在线va拉文| 亚洲色无码国产精品网站可下载| 在线看片韩国免费人成视频| 亚洲美女视频网址| 久久久久国产精品免费免费搜索| ass亚洲**毛茸茸pics| 成人毛片视频免费网站观看| 亚洲成a人片在线观看天堂无码 | 久久亚洲一区二区| 中文字幕在线观看免费视频 | 污污免费在线观看| 亚洲免费视频一区二区三区| 成av免费大片黄在线观看| 亚洲男人第一av网站| 两性刺激生活片免费视频| 精品国产日韩亚洲一区在线| 免费一级毛片在线播放不收费| 国产精品内射视频免费| 内射干少妇亚洲69XXX| 嫩草视频在线免费观看| 一区二区在线视频免费观看| 亚洲成AV人片在线观看无| 1000部拍拍拍18勿入免费凤凰福利 | av无码久久久久不卡免费网站| 亚洲欧美第一成人网站7777 | 最新国产AV无码专区亚洲| 一个人免费日韩不卡视频| 亚洲精品午夜国产va久久| 亚洲国产成人久久精品99 | 免费又黄又爽又猛大片午夜| 亚洲日本一区二区三区| 三年片在线观看免费大全| 色老头综合免费视频| 亚洲成a人片7777| 亚洲狠狠爱综合影院婷婷|