自動裝配(Autowiring Collaborators)

Spring容器可以自動連接協(xié)作bean之間的關(guān)系悲没。您可以通過檢查ApplicationContext的內(nèi)容讓Spring自動為您的bean解析協(xié)作者(其他bean)湖笨。自動裝配具有以下優(yōu)點(diǎn):

  • 自動裝配可以顯著減少對指定屬性或構(gòu)造函數(shù)參數(shù)的需要问芬。(在本章其他地方討論的其他機(jī)制谊娇,如bean模板检访,在這方面也很有價值症革。)
  • 自動裝配可以隨著對象的發(fā)展更新配置筐咧。例如,如果需要向類添加依賴項(xiàng)噪矛,則可以自動滿足該依賴項(xiàng)量蕊,而無需修改配置。因此艇挨,自動裝配在開發(fā)期間尤其有用残炮,而不會在代碼庫變得更穩(wěn)定時否定切換到顯式裝配的選項(xiàng)。

1. XML自動裝配

使用基于XML的配置元數(shù)據(jù)(請參閱依賴注入)時缩滨,可以使用<bean />元素的autowire屬性為bean定義指定autowire模式势就。自動裝配功能有四種模式辞居。下表描述了四種自動裝配模式:

Mode Explanation
no (默認(rèn))無自動裝配。Bean引用必須由ref元素定義蛋勺。不建議對較大的部署更改默認(rèn)設(shè)置瓦灶,因?yàn)槊鞔_指定協(xié)作者可以提供更好的控制和清晰度。在某種程度上抱完,它記錄了系統(tǒng)的結(jié)構(gòu)贼陶。(任然可以使用@Autowried注解自動裝配)
byName 按屬性名稱自動裝配。 Spring查找與需要自動裝配的屬性同名的bean巧娱。例如碉怔,如果bean定義按名稱設(shè)置為autowire并且它包含master屬性(即,它具有setMaster(..)方法)禁添,則Spring會查找名為master的bean定義并使用它來設(shè)置屬性撮胧。如果未找到也不回報(bào)錯,這在運(yùn)行時可能會報(bào)空指針異常老翘。
byType 如果容器中只存在一個屬性類型的bean芹啥,則允許屬性自動裝配。如果存在多個铺峭,則拋出致命異常墓怀,這表示您不能對該bean使用byType自動裝配。如果沒有匹配的bean卫键,則不會發(fā)生任何事情(該屬性未設(shè)置)傀履。如果未找到也不回報(bào)錯,這在運(yùn)行時可能會報(bào)空指針異常莉炉。
constructor 類似于byType但適用于構(gòu)造函數(shù)參數(shù)钓账。如果容器中沒有構(gòu)造函數(shù)參數(shù)類型的一個bean,則會引發(fā)致命錯誤絮宁。

通過以上我們可以知道梆暮,如果你的依賴是必須依賴(一定要注入),則不要使用byType羞福,byName的方式自動裝配惕蹄,而是使用構(gòu)造方法自動裝配。因?yàn)闃?gòu)造方法自動裝配治专,會在啟動時就會報(bào)錯(找不到bean)卖陵。

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type

2. 注解的自動裝配

使用注解的自動裝配,自動裝配的顆粒度更細(xì)张峰。我們可以使用@AutoWried泪蔫,@Resource(JSR-250),@Inject(需要javax.inject包)

和xml不一樣的是基于注解的自動裝配喘批,如果找不到bean撩荣,會在啟動時報(bào)錯铣揉。而且@AutoWried可以通過它的required屬性來控制是否需要注入。

  1. @AutoWried

注入時使用在field餐曹,構(gòu)造器逛拱,方法。
一般情況下是基于類型自動裝配台猴。偶爾也可以通過名稱(不使用qualifier和primary)朽合。
有一種特殊情況,如果有兩個相同類型的候選bean饱狂,Spring會將注入點(diǎn)名稱(即field名稱或參數(shù)名稱)與目標(biāo)bean名稱進(jìn)行匹配曹步,然后選擇同名的候選人,如果有的話休讳。

  1. @Resource

注入時使用在field和方法上(只支持單個參數(shù))讲婚。
默認(rèn)是基于名稱自動裝配的。@Resource自動裝配按以下順序裝配:

  1. 使用@Resourcename屬性俊柔,例如:@Resource(name = "Bean1")筹麸;
  2. 不使用name屬性,如果是加在field上Spring會根據(jù)field的名稱匹配婆咸,加在方法上Spring會根據(jù)set方法的名稱或set方法的參數(shù)名來匹配竹捉,例如,Bean的名稱是myBeanName尚骄,則以下示例都能成功匹配:
@Resource
private MyBeanName myBeanName;
-----------------------------------------------------------------------
@Resource
private MyBeanName myBeanName22;//根據(jù)類型匹配和@Autowried一樣
-----------------------------------------------------------------------
private MyBeanName myBeanName13;

@Resource
public void setMyBeanName(MyBeanName myBeanName13){
  this.mybeanName = myBeanName13;
}
---------------------------------------------------------------------
private MyBeanName myBeanName;

@Resource
public void setMyBeanName33(MyBeanName myBeanName){
  this.mybeanName = myBeanName;
}
  1. 如果以上條件都不滿足,則根據(jù)類型匹配侵续,如果有多個或沒有倔丈,則報(bào)錯。

從JDK9開始状蜗,@Resource不包含再jdk中需五,使用時需要導(dǎo)入java.xml.ws.annotation模塊。

  1. @Inject

@Autowried一樣轧坎,該注解可以使用在field宏邮,構(gòu)造器,方法上缸血。
通過類型注入蜜氨。

有一點(diǎn)需要注意,如果你的裝配使用注解裝配捎泻,則會忽略你的xml如何配置的autowire屬性飒炎,也就是說無論> 你怎么配置autowire都不起作用。

還有如果你想使用xml的注解自動裝配笆豁,需要添加<context:annotation-config/>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末郎汪,一起剝皮案震驚了整個濱河市赤赊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌煞赢,老刑警劉巖抛计,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異照筑,居然都是意外死亡爷辱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門朦肘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饭弓,“玉大人,你說我怎么就攤上這事媒抠〉芏希” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵趴生,是天一觀的道長阀趴。 經(jīng)常有香客問我,道長苍匆,這世上最難降的妖魔是什么刘急? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮浸踩,結(jié)果婚禮上叔汁,老公的妹妹穿的比我還像新娘。我一直安慰自己检碗,他們只是感情好据块,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著折剃,像睡著了一般另假。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怕犁,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天边篮,我揣著相機(jī)與錄音,去河邊找鬼奏甫。 笑死戈轿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扶檐。 我是一名探鬼主播凶杖,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼款筑!你這毒婦竟也來了智蝠?” 一聲冷哼從身側(cè)響起腾么,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杈湾,沒想到半個月后解虱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漆撞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年殴泰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浮驳。...
    茶點(diǎn)故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡悍汛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出至会,到底是詐尸還是另有隱情离咐,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布奉件,位于F島的核電站宵蛀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏县貌。R本人自食惡果不足惜术陶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煤痕。 院中可真熱鬧梧宫,春花似錦、人聲如沸杭攻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兆解。三九已至,卻和暖如春跑揉,著一層夾襖步出監(jiān)牢的瞬間锅睛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工历谍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留现拒,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓望侈,卻偏偏與公主長得像印蔬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脱衙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評論 2 361