【Spring】依賴注入

有關(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ù)定義的實體引用

符號 實體引用
& &amp;
> &gt;
< &lt;
" &quots;
' &apos;

嚴(yán)格地講,在 XML 中僅有字符 "<"和"&" 是非法的。省略號、引號和大于號是合法的,但是把它們替換為實體引用是個好的習(xí)慣。

方式①.png
方式②.png
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)簽

三、結(jié)語:此篇的學(xué)習(xí)任務(wù)就到此結(jié)束了,接下來學(xué)習(xí)采用注解方式實現(xiàn)IoC。這是邊看書邊摘抄記錄的要點和一些實踐體會,感謝看到此處~覺得哪篇文章有用就點個喜歡給小江鼓勵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容