說(shuō)說(shuō) Spring 各種類型的依賴注入?yún)?shù)

1 包含 XML 特殊符號(hào)

在 Spring 配置文件中聊记,可以使用字面值來(lái)提供配置的值。如果配置的值包含 XML 特殊符號(hào)恢暖,那么可以在屬性值外添加一個(gè) XML 特殊處理標(biāo)簽 <![CDATA[]]> 排监,作用是讓 XML 解析器將標(biāo)簽中的字符串當(dāng)作普通文本來(lái)對(duì)待。

XML 中有 5 個(gè)特殊字符杰捂,有兩種方式可以對(duì)這些字符進(jìn)行特別處理舆床。

  • 使用標(biāo)簽 <![CDATA[]]>,來(lái)包裹特殊字符嫁佳。
  • 使用 XML 轉(zhuǎn)義序列來(lái)表示這些字符挨队。
特殊字符 轉(zhuǎn)義序列
< &lt;
> &gt;
& &amp;
" &quot;
' &apos;

注意: Spring 不會(huì)忽略標(biāo)簽內(nèi)容字符串的前后空格。

2 引用其他 Bean

Spring IoC 容器中定義的 Bean 可以相互引用蒿往。

<bean id="author" class="net.deniro.spring4.bean.Author">
    <property name="name" value="deniro"/>
</bean>
<bean id="book" class="net.deniro.spring4.bean.Book">
    <property name="author">
        <ref bean="author"></ref>
    </property>
</bean>

<ref> 元素可以通過(guò)以下 3 個(gè)屬性引用容器中的其他 Bean:

屬性 說(shuō)明
bean 可以引用同一容器或父容器中的 Bean盛垦。
local 只能引用同一個(gè)配置文件中定義的 Bean,會(huì)自動(dòng)檢查合法性 瓤漏。
parent 引用父容器中的 Bean 腾夯,如 <ref parent="xxx"> ,說(shuō)明這個(gè) Bean 的父容器是 xxx蔬充。

父容器配置:

<!-- 父容器-->
<bean id="author" class="net.deniro.spring4.bean.Author">
    <property name="name" value="deniroFather"/>
</bean>

子容器配置:

<bean id="author" class="net.deniro.spring4.bean.Author">
    <property name="name" value="deniro"/>
</bean>

<bean id="book" class="net.deniro.spring4.bean.Book">
    <property name="author">
        <ref parent="author"/>
    </property>
</bean>

子容器配置中存在與父容器相同的 bean id(這里是 author)蝶俱,在 book 中,我們使用的是 <ref parent="author"/>饥漫,所以它引用的是父容器的 Bean榨呆。

ApplicationContext parent = new ClassPathXmlApplicationContext
        (new String[]{"parent.xml"});
ApplicationContext context = new ClassPathXmlApplicationContext(new
        String[]{"beans.xml"},
        parent);////把父容器上下文作為參數(shù)傳入

3 內(nèi)部 Bean

如果某個(gè) Bean 只在一個(gè)確定的 Bean 中被引用,那么它可以以內(nèi)部 Bean 的形式被引用:

<bean id="book" class="net.deniro.spring4.bean.Book">
    <property name="author">
        <bean class="net.deniro.spring4.bean.Author">
            <property name="name" value="deniro"/>
        </bean>
    </property>
</bean>

內(nèi)部 Bean 與 Java 的匿名內(nèi)部類類似庸队,它沒(méi)有名字愕提,所以只能在聲明處注入實(shí)例馒稍。

注意:內(nèi)部 Bean 的 id、name 與 scope 屬性配置是無(wú)效的浅侨,scope 屬性默認(rèn)為 prototype纽谒,無(wú)法更改。

4 null 值

有時(shí)候需要注入一個(gè) null 值如输,那么可以使用 <null/>

<bean id="book2" class="net.deniro.spring4.bean.Book">
    <property name="name"><null/></property>
</bean>

5 級(jí)聯(lián)屬性

Spring 支持級(jí)聯(lián)屬性鼓黔。假設(shè)我們希望在 book 中直接注入 author 的名字:

<bean id="book3" class="net.deniro.spring4.bean.Book">
    <property name="author.name" value="deniro"/>
</bean>

還需要初始化 Book 類的 author 屬性:

private Author author=new Author();

如果沒(méi)有初始化 author 屬性,Spring 將拋出 NullValueInNestedPathException 異常不见。

只要配置的 Bean 擁有對(duì)應(yīng)于級(jí)聯(lián)屬性的類結(jié)構(gòu)澳化,就可以配置任意層級(jí)的級(jí)聯(lián)屬性。

6 集合類型

Spring 為 List稳吮、Set缎谷、Map 與 Properties 提供了專屬的配置標(biāo)簽。

6.1 List

<bean id="book4" class="net.deniro.spring4.bean.Book">
       <property name="labels">
           <list>
               <value>歷史</value>
               <value>傳記</value>
           </list>
       </property>
    </bean>

為 Book 添加 labels 屬性:

/**
 * 標(biāo)簽
 */
private List<String> labels=new ArrayList<String>();

public List<String> getLabels() {
    return labels;
}

public void setLabels(List<String> labels) {
    this.labels = labels;
}

list 屬性既可以通過(guò) <value> 注入字符串灶似,也可以使用 <ref> 注入容器中的其他 Bean列林。

注意: 一個(gè)屬性類型,如果可以通過(guò)字符串的字面值進(jìn)行配置酪惭,那么該類型所對(duì)應(yīng)的數(shù)組類型(如:String[]希痴、int[])也可以采用 <list> 的方式進(jìn)行配置。

6.2 Set

Set 配置與 List 配置相似:

<bean id="book5" class="net.deniro.spring4.bean.Book">
    <property name="labelSet">
        <set>
            <value>歷史</value>
            <value>傳記</value>
        </set>
    </property>
</bean>

labelSet 在 Book 中必須是 Set 類型:

private Set<String> labelSet=new HashSet<String>();

public Set<String> getLabelSet() {
    return labelSet;
}

public void setLabelSet(Set<String> labelSet) {
    this.labelSet = labelSet;
}

6.3 Map

我們?yōu)?Book 添加版本說(shuō)明:

/**
 * 版本
 */
private Map<String,String> versions=new HashMap();

public Map<String, String> getVersions() {
    return versions;
}

public void setVersions(Map<String, String> versions) {
    this.versions = versions;
}

配置:

<bean id="book6" class="net.deniro.spring4.bean.Book">
    <property name="versions">
        <map>
            <entry>
                <key><value>1</value></key>
                <value>2017-1</value>
            </entry>
            <entry>
                <key><value>2</value></key>
                <value>2017-2</value>
            </entry>
        </map>
    </property>
</bean>

如果某個(gè) Map 元素的鍵與值是對(duì)象春感,那么可以這樣配置:

<entry>
    <key><ref bean="keyBean"/></key>
    <ref bean="valueBean"/>
</entry>

6.4 Properties

Map 元素的鍵與值可以是任意類型對(duì)象砌创,而 Properties 元素的鍵與值只能是字符串,所以 Properties 元素其實(shí)是 Map 元素的特殊情況鲫懒。

我們?yōu)?Author 添加地址屬性列:

/**
 * 地址
 */
private Properties addresses=new Properties();

public Properties getAddresses() {
    return addresses;
}

public void setAddresses(Properties addresses) {
    this.addresses = addresses;
}

配置:

<bean id="author1" class="net.deniro.spring4.bean.Author">
    <property name="addresses">
        <props>
            <prop key="home">北京</prop>
            <prop key="work">杭州</prop>
        </props>
    </property>
</bean>

因?yàn)?Properties 元素的鍵值只能是字符串嫩实,所以配置上比 Map 來(lái)的簡(jiǎn)單。

6.5 強(qiáng)類型集合

強(qiáng)類型指的是包裝類型窥岩,如果 POJO 中甲献,存在強(qiáng)類型的集合,Spring 也可以注入:

/**
 * 收入
 */
private Map<String,Double> income=new HashMap<String, Double>();

public Map<String, Double> getIncome() {
    return income;
}

public void setIncome(Map<String, Double> income) {
    this.income = income;
}

配置:

<bean id="author2" class="net.deniro.spring4.bean.Author">
    <property name="income">
        <map>
            <entry>
                <key>
                    <value>第一季度</value>
                </key>
                <value>20000.00</value>
            </entry>
            <entry>
                <key>
                    <value>第二季度</value>
                </key>
                <value>30000.00</value>
            </entry>
        </map>
    </property>
</bean>

Spring 容器在注入強(qiáng)類型集合時(shí)谦秧,會(huì)判斷元素的類型竟纳,把相應(yīng)的配置值轉(zhuǎn)換為對(duì)應(yīng)的數(shù)據(jù)類型。

6.6 合并集合

Spring 允許子 <bean> 繼承 父 <bean> 中同名屬性的集合元素疚鲤。

<!-- 父 Bean -->
<bean id="fatherBook" class="net.deniro.spring4.bean.Book" abstract="true">
    <property name="labels">
        <list>
            <value>歷史</value>
            <value>地理</value>
        </list>
    </property>
</bean>
<!-- 子 Bean -->
<bean id="childBook" class="net.deniro.spring4.bean.Book" parent="fatherBook">
    <property name="labels">
        <list merge="true">
            <value>天文</value>
            <value>數(shù)學(xué)</value>
        </list>
    </property>
</bean>

配置中把父 bean 的 abstract 屬性設(shè)置為 true锥累,表示是一個(gè)抽象的 Bean;然后在子 Bean的 parent 屬性中指定父 bean 的 id集歇;最后把集合標(biāo)簽的 merge 設(shè)置為 true桶略,表示合并。

6.7 集合類型的 Bean

上面所說(shuō)的都是在一個(gè) Bean 中配置集合類型的屬性。如果需要一個(gè)集合類型的 Bean际歼,則需要使用 util 命名空間惶翻。首先在 Spring 的配置文件頭中引入 util 命名空間:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util-4.0.xsd
       ">

配置 List:

<util:list id="type" list-class="java.util.LinkedList">
    <value>人文</value>
    <value>科技</value>
</util:list>

配置 Set:

<util:set id="type2" set-class="java.util.HashSet">
    <value>人文</value>
    <value>科技</value>
</util:set>

配置 Map:

<util:map id="config" map-class="java.util.HashMap">
    <entry key="賬號(hào)" value="admin"/>
    <entry key="密碼" value="123456"/>
</util:map>

提示:

  • xxx-class 屬性為可選項(xiàng)。
  • <util:list><util:set> 擁有 value-type 屬性鹅心,可以指定集合中的值類型吕粗。
  • <util:map> 擁有 key-type 和 value-type 屬性,可以指定 Map 的鍵或值的類型旭愧。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颅筋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子输枯,更是在濱河造成了極大的恐慌议泵,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桃熄,死亡現(xiàn)場(chǎng)離奇詭異先口,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)瞳收,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門碉京,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人缎讼,你說(shuō)我怎么就攤上這事收夸】咏常” “怎么了血崭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)厘灼。 經(jīng)常有香客問(wèn)我夹纫,道長(zhǎng),這世上最難降的妖魔是什么设凹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任舰讹,我火速辦了婚禮,結(jié)果婚禮上闪朱,老公的妹妹穿的比我還像新娘月匣。我一直安慰自己,他們只是感情好奋姿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布锄开。 她就那樣靜靜地躺著,像睡著了一般称诗。 火紅的嫁衣襯著肌膚如雪萍悴。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音癣诱,去河邊找鬼计维。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撕予,可吹牛的內(nèi)容都是我干的鲫惶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼实抡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剑按!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起澜术,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤艺蝴,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鸟废,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體猜敢,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年盒延,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缩擂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡添寺,死狀恐怖胯盯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情计露,我是刑警寧澤博脑,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站票罐,受9級(jí)特大地震影響叉趣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜该押,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一疗杉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚕礼,春花似錦烟具、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至罩润,卻和暖如春玖翅,著一層夾襖步出監(jiān)牢的瞬間翼馆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工金度, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留应媚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓猜极,卻偏偏與公主長(zhǎng)得像中姜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子跟伏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345