programmer's home, welcome here!

          technical issues and my life

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          Spring內(nèi)核研究-管理bean之間的關(guān)系三(自動(dòng)裝配)

          Spring BeanFactory提供了類(lèi)似pico container中自動(dòng)裝配組件依賴(lài)的對(duì)象的功能。自動(dòng)裝配能應(yīng)用在每個(gè)組件上,可以為一些組件定義自動(dòng)裝配,而另一些組件則不使用。
              使用”autowire”屬性可以設(shè)置自動(dòng)裝配,autowire有五種模式:
              no
              默認(rèn)屬性,不進(jìn)行自動(dòng)裝配。
              byName
              通過(guò)bean的屬性名稱(chēng)自動(dòng)裝配合作者。

          SHAPE \* MERGEFORMAT

           

           

          按照bean定義的名稱(chēng)自動(dòng)裝配


              Spring用bean 中set方法名和BeanFactory中定義的合作者的名稱(chēng)做匹配,一但2者匹配,Sping就會(huì)把合作者進(jìn)行注入。
          可以使用id屬性也可以使用name屬性定義合作者的名稱(chēng),這2個(gè)屬性在Spring進(jìn)行自動(dòng)裝配時(shí)沒(méi)有區(qū)別。
          當(dāng)有多個(gè)名稱(chēng)相同的合作者在Spring中定義時(shí),Srping在自動(dòng)裝配時(shí)選擇最后一個(gè)定義的合作者注入。

          SHAPE \* MERGEFORMAT

           

          這個(gè)Bean將被注入到dao


              在多個(gè)合作者名稱(chēng)相同進(jìn)行自動(dòng)裝配時(shí),合作者的id屬性并不會(huì)比name屬性?xún)?yōu)先處理。無(wú)論怎樣定義Spring總會(huì)把最后一個(gè)定義的合作者注入。
          byType
              通過(guò)bean set方法中參數(shù)的類(lèi)型和BeanFactory中定義合作者的類(lèi)型做匹配,Spring會(huì)找到匹配的合作者進(jìn)行注入。

          SHAPE \* MERGEFORMAT

           

           

          按照bean定義的類(lèi)型自動(dòng)裝配


              在byType自動(dòng)裝配模式中,Spring不關(guān)心合作者的名稱(chēng),只關(guān)心合作者的類(lèi)型是否滿(mǎn)足條件。
          類(lèi)似上面介紹的byName的方式,在byType方式中,當(dāng)具有相同名稱(chēng)并且有相同類(lèi)型的多個(gè)合作者被找到時(shí),Spring會(huì)注入最后一個(gè)定義的合作者。

          SHAPE \* MERGEFORMAT

           

          這個(gè)Bean將被注入到dao


          在byType裝配時(shí),如果有2個(gè)不同名稱(chēng)但是類(lèi)型相同的合作者被找到,那么Spring會(huì)拋出一個(gè)依賴(lài)異常。

          SHAPE \* MERGEFORMAT

           


          拋出依賴(lài)異常,通知用戶(hù)在byType方式中同樣類(lèi)型的Bean只能定義一個(gè)。

          org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dao' defined in class path resource [research/spring/beanfactory/ch3/context.xml]: Unsatisfied dependency expressed through bean property 'database': There are 2 beans of type [class research.spring.beanfactory.ch3.Database] for autowire by type. There should have been 1 to be able to autowire property 'database' of bean 'dao'...

          constructor

          constructor其實(shí)時(shí)按byType的方式進(jìn)行構(gòu)造函數(shù)的注入。

          SHAPE \* MERGEFORMAT

           

           

          按照bean定義的類(lèi)型自動(dòng)裝配

                 

              constructor裝配方式不關(guān)心構(gòu)造參數(shù)的順序,無(wú)論構(gòu)造函數(shù)參數(shù)的順序如何Spring都會(huì)按類(lèi)型匹配到正確的合作者進(jìn)行注入。

              在byType方式中,當(dāng)沒(méi)有找到類(lèi)型相同的合作者時(shí)Spring什么都不會(huì)去做。但是在constructor方式中,當(dāng)沒(méi)有找到和Bean構(gòu)造函數(shù)中參數(shù)類(lèi)型相匹配的合作者時(shí),Spring會(huì)拋出異常。
              Spring在進(jìn)行constructor方式的自動(dòng)裝配時(shí),強(qiáng)制要求所有的構(gòu)造函數(shù)中所有的合作者都必須存在。
          autodetect
              在autodetect的方式中,Spring檢查一個(gè)Bean內(nèi)部是否有默認(rèn)的構(gòu)造函數(shù)。如果有默認(rèn)的參數(shù)Spring就使用byType的方式進(jìn)行自動(dòng)裝配。如果沒(méi)有默認(rèn)的構(gòu)造函數(shù)Spring則使用constructor的方式進(jìn)行自動(dòng)裝配。
          如果一個(gè)Bean同時(shí)定義了默認(rèn)構(gòu)造函數(shù)和帶參數(shù)的構(gòu)造函數(shù),Spring仍會(huì)使用byType的方式進(jìn)行裝配。
           
           
              不管使用上述哪種裝配方式,都可以在Bean中顯示的定義合作者。顯示定義的依賴(lài)關(guān)系優(yōu)先級(jí)比自動(dòng)裝配高。
          自動(dòng)裝配的功能可以和自動(dòng)依賴(lài)檢查一起使用。Spring會(huì)首先進(jìn)行自動(dòng)裝配,然后在進(jìn)行依賴(lài)檢查。
          自動(dòng)裝配提供了簡(jiǎn)化配置的可能性,但是我并不建議在項(xiàng)目中大量的使用自動(dòng)裝配,特別時(shí)byType方式。因?yàn)樽詣?dòng)裝配,尤其時(shí)byType方式,破壞了Bean和合作者之間顯示的依賴(lài)關(guān)系,所有的依賴(lài)關(guān)系都時(shí)不明顯的。在使用自動(dòng)裝配后我們的依賴(lài)關(guān)系需要到源代碼中才能看到,這使得維護(hù)或文檔化Bean的依賴(lài)關(guān)系變得很困難。
          適當(dāng)?shù)氖褂米詣?dòng)裝配比如byName方式的裝配,是有一些好處的。比如我們?cè)谝恍┨囟ǖ姆秶锟梢越柚鷅yName自動(dòng)裝配的功能來(lái)實(shí)現(xiàn)“以慣例來(lái)代替配置”的框架。

          posted on 2007-04-09 03:01 crazy zerlot 閱讀(349) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 尼玛县| 嘉兴市| 罗城| 开封市| 青冈县| 太原市| 英山县| 南投县| 德清县| 鸡东县| 东莞市| 文昌市| 天门市| 广水市| 宁阳县| 东山县| 长岭县| 洪洞县| 两当县| 象州县| 肇州县| 油尖旺区| 民勤县| 正安县| 云梦县| 卓资县| 陇川县| 鹤岗市| 益阳市| 西乡县| 温州市| 揭东县| 鄂温| 林甸县| 巨野县| 璧山县| 秦安县| 和硕县| 秦皇岛市| 连江县| 闽清县|