前面我們學習了spring容器的兩種注入方式,設值注入和構造注入,並且對引用變量和基本變量(或者String變量)注入的方式都做了不同說明,現在我們繼續來學習一些簡便特殊的注入方式:
一、autowire(自動裝配)
<bean>的autowire屬性有如下六個取值,他們的說明如下:
1、 No:即不啟用自動裝配。Autowire默認的值。不使用Autowire,引用關系顯示聲明,spring的reference也建議不用autoware,因為這會破壞模塊關系的可讀性。
2、 byName:通過屬性的名字的方式查找JavaBean依賴的對象並為其注入。比如說類Computer有個屬性printer,指定其autowire屬性為byName后,Spring IoC容器會在配置文件中查找id/name屬性為printer的bean,然后使用Seter方法為其注入。
3、 byType:通過屬性的類型查找JavaBean依賴的對象並為其注入。比如類Computer有個屬性printer,類型為Printer,那么,指定其autowire屬性為byType后,Spring IoC容器會查找Class屬性為Printer的bean,使用Seter方法為其注入。如果存在多個該類型bean,那么拋出異常,並指出不能使用byType方式進行自動裝配;如果沒有找到相匹配的bean,則什么事都不發生,也可以通過設置dependency-check="objects"讓Spring拋出異常。
4、 constructor:通byType一樣,也是通過類型查找依賴對象。與byType的區別在於它不是使用Seter方法注入,而是使用構造子注入。如果容器中沒有找到與構造器參數類型一致的bean,那么拋出異常。
5、 autodetect:在byType和constructor之間自動的選擇注入方式。通過bean類的自省機制(introspection)來決定是使用constructor還是byType方式進行自動裝配。如果發現默認的構造器,那么將使用byType方式,否則采用
constructor。
6、 default:由上級標簽<beans>的default-autowire屬性確定。
注意:在配置bean時,<bean>標簽中Autowire屬性的優先級比其上級標簽高,即是說,如果在上級標簽中定義default-autowire屬性為byName,而在<bean>中定義為byType時,Spring IoC容器會優先使用<bean>標簽的配置。