【第三章】 DI 之 3.1.2 DI的配置使用 ——跟我學spring3

3.1.4  注入常量

       注入常量是依賴注入中最簡單的。配置方式以下所示:html

 

java代碼:java

查看複製到剪貼板打印spring

  1. <property name="message" value="Hello World!"/>  數組

  2. 或  數據結構

  3. <property name="index"><value>1</value></property><span class="Apple-style-span" style="font-size: 14px; white-space: normal; background-color: #ffffff;"> </span>  ide

 

       以上兩種方式均可以,從配置來看第一種更簡潔。注意此處「value」中指定的全是字符串,由Spring容器將此字符串轉換成屬性所須要的類型,若是轉換出錯,將拋出相應的異常。學習

Spring容器目前能對各類基本類型把配置的String參數轉換爲須要的類型。測試

注:Spring類型轉換系統對於boolean類型進行了容錯處理,除了能夠使用「true/false」標準的Java值進行注入,還能使用「yes/no」、「on/off」、「1/0」來表明「真/假」,因此你們在學習或工做中遇到這種相似問題不要以爲是人家配置錯了,而是Spring容錯作的很是好。this

 

java代碼:spa

查看複製到剪貼板打印

  1. 測試類  

  2. public class BooleanTestBean {  

  3.     private boolean success;  

  4.     public void setSuccess(boolean success) {  

  5.         this.success = success;  

  6.     }  

  7.     public boolean isSuccess() {  

  8.         return success;  

  9.     }  

  10. }  

  11. 配置文件(chapter3/booleanInject.xml)片斷:  

  12. <!-- boolean參數值能夠用on/off -->  

  13. <bean id="bean2" class="cn.javass.spring.chapter3.bean.BooleanTestBean">  

  14.     <property name="success" value="on"/>  

  15. </bean>  

  16. <!-- boolean參數值能夠用yes/no -->  

  17. <bean id="bean3" class="cn.javass.spring.chapter3.bean.BooleanTestBean">  

  18.     <property name="success" value="yes"/>  

  19. </bean>  

  20. <!-- boolean參數值能夠用1/0 -->  

  21. <bean id="bean4" class="cn.javass.spring.chapter3.bean.BooleanTestBean">  

  22.     <property name="success" value="1"/>  

  23. </bean>  

3.1.5    注入Bean ID

用於注入Bean的ID,ID是一個常量不是引用,且相似於注入常量,但提供錯誤驗證功能,配置方式以下所示:

 

java代碼:

查看複製到剪貼板打印

  1. <property name="id"><idref bean="bean1"/></property>  

 

 

java代碼:

查看複製到剪貼板打印

  1. <property name="id"><idref local="bean2"/></property>  

 

兩種方式均可以,上述配置本質上在運行時等於以下方式

 

java代碼:

查看複製到剪貼板打印

  1. <bean id="bean1" class="……"/>  

  2. <bean id="idrefBean1" class="……">  

  3. <property name="id" value ="bean1"/>  

  4. </bean>  

 

第二種方式(<idref bean="bean1"/>)能夠在容器初始化時校驗被引用的Bean是否存在,若是不存在將拋出異常,而第一種方式(<idref local="bean2"/>)只有在Bean實際使用時才能發現傳入的Bean的ID是否正確,可能發生不可預料的錯誤。所以若是想注入Bean的ID,推薦使用第二種方式。

接下來學習一下如何使用吧:

 

首先定義測試Bean:

 

java代碼:

查看複製到剪貼板打印

  1. package cn.javass.spring.chapter3.bean  

  2. public class IdRefTestBean {  

  3.     private String id;  

  4.     public String getId() {  

  5.         return id;  

  6.     }  

  7.     public void setId(String id) {  

  8.         this.id = id;  

  9.     }  

  10. }  

 

其次定義配置文件(chapter3/idRefInject.xml):

 

java代碼:

查看複製到剪貼板打印

  1. <bean id="bean1" class="java.lang.String">  

  2. <constructor-arg index="0" value="test"/>  

  3. </bean>  

  4. <bean id="bean2" class="java.lang.String">  

  5.     <constructor-arg index="0" value="test"/>  

  6. </bean>  

 

 

java代碼:

查看複製到剪貼板打印

  1. <bean id="idrefBean1" class="cn.javass.spring.chapter3.bean.IdRefTestBean">  

  2.         <property name="id"><idref bean="bean1"/></property>  

  3. </bean>  

  4. <bean id="idrefBean2" class="cn.javass.spring.chapter3.bean.IdRefTestBean">  

  5.     <property name="id"><idref local="bean2"/></property>  

  6. </bean>  

 

       從配置中能夠看出,注入的Bean的ID是一個java.lang.String類型,即字符串類型,所以注入的一樣是常量,只是具備校驗功能。

<idref bean="……"/>將在容器初始化時校驗注入的ID對於的Bean是否存在,若是不存在將拋出異常。

<idref local="……"/>將在XML解析時校驗注入的ID對於的Bean在當前配置文件中是否存在,若是不存在將拋出異常,它不一樣於<idref bean="……"/>,<idref local="……"/>是校驗發生在XML解析式而非容器初始化時,且只檢查當前配置文件中是否存在相應的Bean。

 

3.1.6  注入集合、數組和字典

       Spring不只能注入簡單類型數據,還能注入集合(Collection、無序集合Set、有序集合List)類型、數組(Array)類型、字典(Map)類型數據、Properties類型數據,接下來就讓咱們一個個看看如何注入這些數據類型的數據。

       1、注入集合類型:包括Collection類型、Set類型、List類型數據:

       (1)List類型:須要使用<list>標籤來配置注入,其具體配置以下:

 

       讓咱們來寫個測試來練習一下吧:

             準備測試類:

 

java代碼:

查看複製到剪貼板打印

  1. package cn.javass.spring.chapter3.bean;  

  2. import java.util.List;  

  3. public class ListTestBean {  

  4.     private List<String> values;  

  5.     public List<String> getValues() {  

  6.         return values;  

  7.     }  

  8.     public void setValues(List<String> values) {  

  9.         this.values = values;  

  10.     }  

  11. }  

 

              進行Bean定義,在配置文件(resources/chapter3/listInject.xml)中配置list注入:

 

java代碼:

查看複製到剪貼板打印

  1. <bean id="listBean" class="cn.javass.spring.chapter3.bean.ListTestBean">  

  2.     <property name="values">  

  3.         <list>  

  4.             <value>1</value>  

  5.             <value>2</value>  

  6.             <value>3</value>  

  7.         </list>  

  8.    </property>  

  9. </bean>  

 

              測試代碼:

 

java代碼:

查看複製到剪貼板打印

  1. @Test   

  2. public void testListInject() {  

  3.    BeanFactory beanFactory =  

  4. new ClassPathXmlApplicationContext("chapter3/listInject.xml");  

  5. ListTestBean listBean = beanFactory.getBean("listBean", ListTestBean.class);  

  6. System.out.println(listBean.getValues().size());  

  7. Assert.assertEquals(3, listBean.getValues().size());  

  8. }  

 

 

(2)Set類型:須要使用<set>標籤來配置注入,其配置參數及含義和<lsit>標籤徹底同樣,在此就不闡述了:

              準備測試類:

 

java代碼:

查看複製到剪貼板打印

  1. package cn.javass.spring.chapter3.bean;  

  2. import java.util.Collection;  

  3. public class CollectionTestBean {  

  4.     private Collection<String> values;  

  5.     public void setValues(Collection<String> values) {  

  6.         this.values = values;  

  7.     }  

  8.     public Collection<String> getValues() {  

  9.         return values;  

  10.     }  

  11. }  

 

              進行Bean定義,在配置文件(resources/chapter3/listInject.xml)中配置list注入:

 

java代碼:

查看複製到剪貼板打印

  1. <bean id="setBean" class="cn.javass.spring.chapter3.bean.SetTestBean">  

  2. <property name="values">  

  3. <set>  

  4. <value>1</value>  

  5. <value>2</value>  

  6. <value>3</value>  

  7. </set>  

  8. </property>  

  9. </bean>  

              具體測試代碼就不寫了,和listBean測試代碼徹底同樣。

 

       (2)Collection類型:由於Collection類型是Set和List類型的基類型,因此使用<set>或<list>標籤均可以進行注入,配置方式徹底和以上配置方式同樣,只是將測試類屬性改爲「Collection」類型,若是配置有問題,可參考cn.javass.spring.chapter3.DependencyInjectTest測試類中的testCollectionInject測試方法中的代碼。

2、注入數組類型:須要使用<array>標籤來配置注入,其中標籤屬性「value-type」和「merge」和<list>標籤含義徹底同樣,具體配置以下:

 

       若是練習時遇到配置問題,能夠參考「cn.javass.spring.chapter3.DependencyInjectTest」測試類中的testArrayInject測試方法中的代碼。

3、注入字典(Map)類型:字典類型是包含鍵值對數據的數據結構,須要使用<map>標籤來配置注入,其屬性「key-type」和「value-type」分別指定「鍵」和「值」的數據類型,其含義和<list>標籤的「value-type」含義同樣,在此就不羅嗦了,並使用<key>子標籤來指定鍵數據,<value>子標籤來指定鍵對應的值數據,具體配置以下:

 

       若是練習時遇到配置問題,能夠參考「cn.javass.spring.chapter3.DependencyInjectTest」測試類中的testMapInject測試方法中的代碼。

4、Properties注入:Spring能注入java.util.Properties類型數據,須要使用<props>標籤來配置注入,鍵和值類型必須是String,不能變,子標籤<prop key=」鍵」>值</prop>來指定鍵值對,具體配置以下:

 

 

若是練習時遇到配置問題,能夠參考cn.javass.spring.chapter3.DependencyInjectTest測試類中的testPropertiesInject測試方法中的代碼。

       到此咱們已經把簡單類型及集合類型介紹完了,你們可能會問怎麼沒見注入「Bean之間關係」的例子呢?接下來就讓咱們來說解配置Bean之間依賴關係,也就是注入依賴Bean。

 

 

 

3.1.7  引用其它Bean

       上邊章節已經介紹了注入常量、集合等基本數據類型和集合數據類型,本小節將介紹注入依賴Bean及注入內部Bean。

       引用其餘Bean的步驟與注入常量的步驟同樣,能夠經過構造器注入及setter注入引用其餘Bean,只是引用其餘Bean的注入配置稍微變化了一下:能夠將「<constructor-arg index="0" value="Hello World!"/>」和「<property name="message" value="Hello World!"/>」中的value屬性替換成bean屬性,其中bean屬性指定配置文件中的其餘Bean的id或別名。另外一種是把<value>標籤替換爲<.ref bean=」beanName」>,bean屬性也是指定配置文件中的其餘Bean的id或別名。那讓咱們看一下具體配置吧:

 

1、構造器注入方式:

(1)經過」 <constructor-arg>」標籤的ref屬性來引用其餘Bean,這是最簡化的配置:

 

(2)經過」 <constructor-arg>」標籤的子<ref>標籤來引用其餘Bean,使用bean屬性來指定引用的Bean:

 

       2、setter注入方式:

(1)經過」 <property>」標籤的ref屬性來引用其餘Bean,這是最簡化的配置:

 

(2)經過」 <property>」標籤的子<ref>標籤來引用其餘Bean,使用bean屬性來指定引用的Bean:

 

 

3、接下來讓咱們用個具體例子來說解一下具體使用吧:

(1)首先讓咱們定義測試引用Bean的類,在此咱們能夠使用原有的HelloApi實現,而後再定義一個裝飾器來引用其餘Bean,具體裝飾類以下:

 

java代碼:

查看複製到剪貼板打印

  1. package cn.javass.spring.chapter3.bean;  

  2. import cn.javass.spring.chapter2.helloworld.HelloApi;  

  3. public class HelloApiDecorator implements HelloApi {  

  4. private HelloApi helloApi;  

  5. //空參構造器  

  6.     public HelloApiDecorator() {  

  7. }  

  8. //有參構造器  

  9.     public HelloApiDecorator(HelloApi helloApi) {  

  10.         this.helloApi = helloApi;  

  11. }    

  12. public void setHelloApi(HelloApi helloApi) {  

  13.         this.helloApi = helloApi;  

  14.     }  

  15.     @Override  

  16.     public void sayHello() {  

  17.         System.out.println("==========裝飾一下===========");  

  18.         helloApi.sayHello();  

  19.         System.out.println("==========裝飾一下===========");  

  20.     }  

  21. }  

 

       (2)定義好了測試引用Bean接下來該在配置文件(resources/chapter3/beanInject.xml)進行配置Bean定義了,在此將演示經過構造器及setter方法方式注入依賴Bean:

 

java代碼:

查看複製到剪貼板打印

  1. <!-- 定義依賴Bean -->  

  2. <bean id="helloApi" class="cn.javass.spring.chapter2.helloworld.HelloImpl"/>  

  3. <!-- 經過構造器注入 -->  

  4. <bean id="bean1" class="cn.javass.spring.chapter3.bean.HelloApiDecorator">  

  5. <constructor-arg index="0" ref="helloApi"/>  

  6. </bean>  

  7. <!-- 經過構造器注入 -->  

  8. <bean id="bean2" class="cn.javass.spring.chapter3.bean.HelloApiDecorator">  

  9.     <property name="helloApi"><ref bean=" helloApi"/></property>  

  10. </bean>  

 

 

(3)測試一下吧,測試代碼(cn.javass.spring.chapter3.DependencyInjectTest)片斷以下:

 

java代碼:

查看複製到剪貼板打印

  1. @Test   

  2. public void testBeanInject() {  

  3.     BeanFactory beanFactory =  

  4. new ClassPathXmlApplicationContext("chapter3/beanInject.xml");  

  5.     //經過構造器方式注入  

  6.     HelloApi bean1 = beanFactory.getBean("bean1", HelloApi.class);  

  7.     bean1.sayHello();  

  8.     //經過setter方式注入  

  9.     HelloApi bean2 = beanFactory.getBean("bean2", HelloApi.class);  

  10.     bean2.sayHello();  

  11. }  

相關文章
相關標籤/搜索