有關(guān)依賴注入的學(xué)習(xí),昨天在這篇文章中已經(jīng)談到了aop的前置增強(qiáng)和后置增強(qiáng)以及IoC的設(shè)值注入,不明白的朋友們可以點擊鏈接跳到此篇去學(xué)習(xí)下,有代碼示例。而此篇是來擴(kuò)展學(xué)習(xí)下
springIoC的其他注入方式以及注入的不同數(shù)據(jù)類型的標(biāo)簽使用。
一、IoC擴(kuò)展
1、構(gòu)造注入用法,即spring通過構(gòu)造方法來賦值。在上面提到的那篇文章中使用的設(shè)值注入是Spring通過JavaBean的無參構(gòu)造方法實例化對象。當(dāng)我們在程序中編寫了有參構(gòu)造方法時,JVM就不會再提供默認(rèn)的無參構(gòu)造方法。建議自行為程序添加一個無參構(gòu)造方法,為什么呢?這樣做是為了保證使用的靈活性,你就可以同時通過Spring使用設(shè)值注入和構(gòu)造注入。
具體操作步驟:先為要注入的類添加構(gòu)造方法,再編寫spring-cfg.xml配置文件,一個<constructor-arg>元素表示構(gòu)造方法的一個參數(shù),使用時不區(qū)分參數(shù)順序。當(dāng)構(gòu)造方法參數(shù)有多個要區(qū)分時,可以使用<constructor-arg>的index屬性指定參數(shù)的位置索引,索引從0開始。還可通過<constructor-arg>的子元素的type屬性指定參數(shù)的類型,避免字符串和基本數(shù)據(jù)類型的混淆。
改造在上面引言提到的文章中打印機(jī)程序,A5Paper紙張通過Spring的構(gòu)造注入方式。修改部分代碼如下:
一、在TextPaper類中加入以下構(gòu)造方法。
//無參構(gòu)造方法,用于方便設(shè)值注入的方式
public TextPaper(){
}
//構(gòu)造方法,用于注入列數(shù)和行數(shù)
public TextPaper(int cols, int rows) {
this.cols = cols;
this.rows = rows;
}
二、修改spring-cfg.xml文件
<bean id="A5Paper" class="TextPaper">
<constructor-arg index="0">
<value type="int">10</value>
</constructor-arg>
<constructor-arg index="1">
<value type="int">7</value>
</constructor-arg>
</bean>
三、大功告成,程序結(jié)果打印正常。
構(gòu)造注入與設(shè)值注入的區(qū)別:構(gòu)造注入的時效性比設(shè)值注入好,在對象實例化時就得到所依賴的對象,便于在對象的初始化方法中使用依賴對象;但受限于方法重載的方式,使用的靈活性不足,設(shè)值注入的靈活性就相對較好。當(dāng)然,Spring提供的注入方式絕不止這兩種,只是這2種常用且簡單,其他方式有興趣的朋友可參考Spring開發(fā)手冊了解。
(#^.^#)一起再額外學(xué)習(xí)一種吧
2、p命名空間注入方式
p命名空間的特點是使用屬性而不是子元素的形式來配置Bean的屬性,從而簡化Bean的配置。
注意:使用p命名空間注入時要先添加p命名空間的聲明: xmlns:p="http://www.springframework.org/schema/p"
也可通過IDEA的快捷鍵 alt+enter 快速創(chuàng)建聲明。
還是改造打印機(jī)程序,修改代碼如下即可:
<bean id="A5Paper" class="TextPaper"
p:cols="15" p:rows="7"/>
二、注入不同的數(shù)據(jù)類型
1、注入直接量(基本數(shù)據(jù)類型,字符串)
可通過value屬性或者通過<value>子元素進(jìn)行注入。
若在XML文件中注入的屬性值包含了XML中的特殊字符(&,<,>,",')這五個時,則注入時需要進(jìn)行特殊處理。
有此兩種解決方法:①使用<![CDATA[ ]]>標(biāo)記 或 ②特殊字符替換為實體引用。
XML預(yù)定義的實體引用
| 符號 | 實體引用 |
|---|---|
| & | & |
| > | > |
| < | < |
| " | "s; |
| ' | ' |
嚴(yán)格地講,在 XML 中僅有字符 "<"和"&" 是非法的。省略號、引號和大于號是合法的,但是把它們替換為實體引用是個好的習(xí)慣。


2、引用其他Bean組件
可通過ref屬性或者通過<ref>子元素進(jìn)行引用Bean。 <ref>子元素有bean屬性和local屬性,用法兩者是一樣的,都是用來指定Bean的id的。它們區(qū)別在于:使用local屬性只能在同一個配置文件中檢索Bean的id,而使用bean實現(xiàn)是可以在其他配置文件中檢索id的。(O(∩_∩)O哈哈~ Spring配置文件是可以拆分的,這篇文章講的不錯。
3、使用內(nèi)部Bean
如果一個Bean組件僅在一處使用,可以定義為內(nèi)部Bean。就是在Bean組件中嵌套Bean,此時內(nèi)部Bean只能給包裹它的Bean使用而已。
4、注入集合類型的屬性
使用<list>標(biāo)簽注入List集合類型或者數(shù)組類型使用<set>標(biāo)簽注入Set集合類型使用<entry>標(biāo)簽注入Map集合類型,內(nèi)部是<key><value>鍵值對標(biāo)簽使用<props>標(biāo)簽注入Properties類型,內(nèi)部是<prop>標(biāo)簽