Spring回顧——自動裝配模式

Spring 支持五種自動裝配模式:

  • byName模式:在使用byName模式進行自動裝配時楣号,Spring會嘗試用每個屬性去上下文中適配同名的bean,例如有一個TestInject bean腊徙,該bean中有一個私有屬性 OmsGoodsVo 并且 我們在ApplicationContext中也定義了名為 OmsGoodsVo這個bean,那么在TestInject初始化時OmsGoodsVo這個bean將會被自動分配給TestInject中的OmsGoodsVo屬性氓皱。

  • byType模式:在使用byType模式進行自動裝配時匾南,Spring會嘗試在Spring上下文中取尋找相同類型的bean去分配給目標bean的對應屬性关斜。

  • 構造函數(shù)模式:該模式和byType模式有異曲同工之妙叽粹,該模式通過bean的構造器進行注入而不是通過setter ,在該模式下Spring總是會嘗試進行構造器最大入?yún)⒌倪m配罪佳,例如TestInjectbean有兩個構造器分別是TestInject1(String,Integer) 和TestInject2(String) 如果在ApplicationContext上下文中同時存在一個String bean和 Integer bean逛漫,那么Spring總是會去使用TestInject1去進行注入。

  • 默認模式:Spring 將自動在構造函數(shù)模式和byType模式之間進行選擇赘艳,選擇的依據(jù)是如果bean存在一個默認的無參數(shù)構造函數(shù)則使用byType模式進行構造酌毡,否則用構造函數(shù)模式。

  • :不使用任何模式蕾管,這是Spring的默認設置


示例

有如下一個簡單的配置文件:appliacation_test.xml枷踏, 我們將使用如下的bean來嘗試不同的裝配模式


<beans>

<bean id="omsGoodsVo"  class="com.biz.tower.vo.OmsGoodsVo"/>

<bean id="stockAllVo"  class="com.biz.tower.vo.StockAllVo"/>

<bean id="injectByType"  class="com.biz.tower.vo.TestInject"  lazy-init="true" 
 autowire="byType"/>

<bean id="injectByName"  class="com.biz.tower.vo.TestInject"  lazy-init="true" 
  autowire="byName"/>

<beanid="injectByConstructor"  class="com.biz.tower.vo.TestInject"  lazy-init="true"  autowire="constructor"/>

</beans>

在上面的配置中可以看見有兩個空類 OmsGoodsVo 和 StockAllVo 并且同時命名為omsGoodsVo和stockAllVo ,同時有三個TestInject類來分別進行byType掰曾,byNameconstructor的注入測試旭蠕,設置lazy-init為true的目的是為了控制日志的打印位置并無其他作用

TestInject類:


/**

* @ClassName TestInject

* @Description 測試注入類

* @Author liuzhibo

* @Date 2019/2/28 11:00 PM

**/

public class TestInject{
 private OmsGoodsVo omsGoodsVoOne;
 private OmsGoodsVo omsGoodsVoTwo;
 private StockAllVo stockAllVo;

 public TestInject() {}
 
 public TestInject(OmsGoodsVo omsGoodsVo){
      System.out.println("單參數(shù)構造注入");
 }

 public TestInject(OmsGoodsVo omsGoodsVo,StockAllVo stockAllVo) {
      System.out.println("雙參數(shù)構造注入");
 }
 
 public void setOmsGoodsVoOne(OmsGoodsVo omsGoodsVoOne) {
      System.out.println("屬性裝配-》set omsGoodsVoOne");
 }

 public void setOmsGoodsVoTwo(OmsGoodsVo omsGoodsVoTwo) {
      System.out.println("屬性裝配-》set omsGoodsVoTwo");
 }
 
 public void setStockAllVo(StockAllVo stockAllVo) {
      System.out.println("屬性裝配-》set stockAllVo");
 }

 public static void main(String[] args) {

   GenericXmlApplicationContext  ctx = new GenericXmlApplicationContext();
   ctx.load("classpath:/application_test.xml");
   ctx.refresh();
   
   TestInjecttestInject = null;
   System.out.println("----------------ByName 測試----------------");
   testInject = (TestInject) ctx.getBean("injectByName");

   System.out.println("----------------ByType 測試----------------");
   testInject = (TestInject) ctx.getBean("injectByType");

   System.out.println("----------------ByConstructor 測試----------------");
   testInject = (TestInject) ctx.getBean("injectByConstructor");
  }
}

在上面這段代碼中,可以看到TestInject類擁有三個構造函數(shù)和三個私有屬性以及對應的setter方法和一個main方法旷坦,我們將通過getBean的方式來分別觸發(fā)byName掏熬,byType,byConstructor注入模式秒梅。

運行結果:

----------------ByName測試----------------

屬性裝配-》set stockAllVo

----------------ByType測試----------------

屬性裝配-》set omsGoodsVoOne

屬性裝配-》set omsGoodsVoTwo

屬性裝配-》set stockAllVo

----------------ByConstructor測試----------------

雙參數(shù)構造注入

可以看到byName模式下只自動注入了stockAllVo旗芬,這是符合我們期望的一個結果,因為在TestInject中只有stockAllVo能通過名稱在ApplocationContext上下文中找到適配的bean番电,當使用byType模式時,spring自動裝配了TestInject類中的所有三個屬性辆琅,構造函數(shù)注入同樣是符合期望的漱办。


Spring自動裝配的日常應用

相信大多數(shù)人都遇到過 org.springframework.beans.factory.NoSuchBeanDefinitionException或者org.springframework.beans.factory.UnsatisfiedDependencyException 這兩個異常,該異常大多數(shù)是在通過@Autowired注入bean時Spring在上下文中發(fā)現(xiàn)了相同類型的bean從而不知道該如何選擇裝配導致的婉烟,所以娩井,有沒有思考過以下問題:

1.為什么@Service通常不會直接打在interface上?

2.@Autowired為什么會有一個@Qualifier 與其適配似袁?@Resource呢洞辣?


參考書籍:
《Spring 5 高級編程》第五版

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市昙衅,隨后出現(xiàn)的幾起案子扬霜,更是在濱河造成了極大的恐慌,老刑警劉巖而涉,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件著瓶,死亡現(xiàn)場離奇詭異,居然都是意外死亡啼县,警方通過查閱死者的電腦和手機材原,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門沸久,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人余蟹,你說我怎么就攤上這事卷胯。” “怎么了威酒?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵窑睁,是天一觀的道長。 經常有香客問我兼搏,道長卵慰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任佛呻,我火速辦了婚禮裳朋,結果婚禮上,老公的妹妹穿的比我還像新娘吓著。我一直安慰自己鲤嫡,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布绑莺。 她就那樣靜靜地躺著暖眼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纺裁。 梳的紋絲不亂的頭發(fā)上诫肠,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音欺缘,去河邊找鬼栋豫。 笑死,一個胖子當著我的面吹牛谚殊,可吹牛的內容都是我干的丧鸯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼嫩絮,長吁一口氣:“原來是場噩夢啊……” “哼丛肢!你這毒婦竟也來了?” 一聲冷哼從身側響起剿干,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蜂怎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后置尔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體派敷,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了篮愉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腐芍。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖试躏,靈堂內的尸體忽然破棺而出猪勇,到底是詐尸還是另有隱情,我是刑警寧澤颠蕴,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布泣刹,位于F島的核電站,受9級特大地震影響犀被,放射性物質發(fā)生泄漏椅您。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一寡键、第九天 我趴在偏房一處隱蔽的房頂上張望掀泳。 院中可真熱鬧,春花似錦西轩、人聲如沸员舵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽马僻。三九已至,卻和暖如春注服,著一層夾襖步出監(jiān)牢的瞬間韭邓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工溶弟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留女淑,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓可很,卻偏偏與公主長得像诗力,于是被迫代替她去往敵國和親凰浮。 傳聞我的和親對象是個殘疾皇子我抠,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容

  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,128評論 2 7
  • 什么是Spring Spring是一個開源的Java EE開發(fā)框架。Spring框架的核心功能可以應用在任何Jav...
    jemmm閱讀 16,441評論 1 133
  • 2.1 我們的理念是:讓別人為你服務 IoC是隨著近年來輕量級容器(Lightweight Container)的...
    好好學習Sun閱讀 2,700評論 0 11
  • 參考W3C Spring教程 Spring致力于J2EE應用的各種解決方案袜茧,而不僅僅專注于某一層解決方案菜拓。可以說S...
    王偵閱讀 1,152評論 0 6
  • 五天的情緒打卡笛厦,今天結束了纳鼎。 第一天主題:憤怒; 第二天主題:焦慮; 第三天主題:委屈贱鄙; 第四天主題:痛苦劝贸; 第五...
    心理咨詢師萍閱讀 206評論 0 1