殘夢追月原創,轉載請注明。
在應用中,我們常常使用<ref>標簽為JavaBean注入它依賴的對象。但是對于一個大型的系統,這個操作將會耗費我們大量的資源,我們不得不花費大量的時間和精力用于創建和維護系統中的<ref>標簽。實際上,這種方式也會在另一種形式上增加了應用程序的復雜性,那么如何解決這個問題呢?Spring為我們提供了一個自動裝配的機制,盡管這種機制不是很完善,但是在應用中結合<ref>標簽還是可以大大的減少我們的勞動強度。前面提到過,在定義Bean時,<bean>標簽有一個autowire屬性,我們可以通過指定它來讓容器為受管JavaBean自動注入依賴對象。
<bean>的autowire屬性有如下六個取值,他們的說明如下:
1、 No:即不啟用自動裝配。Autowire默認的值。
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方法為其注入。
4、 constructor:通byType一樣,也是通過類型查找依賴對象。與byType的區別在于它不是使用Seter方法注入,而是使用構造子注入。
5、 autodetect:在byType和constructor之間自動的選擇注入方式。
6、 default:由上級標簽<beans>的default-autowire屬性確定。
注意:在配置bean時,<bean>標簽中Autowire屬性的優先級比其上級標簽高,即是說,如果在上級標簽中定義default-autowire屬性為byName,而在<bean>中定義為byType時,Spring IoC容器會優先使用<bean>標簽的配置。
下面通過一個例子來說明如何在應用中使用自動裝配(工程代碼見例程3.2)。新建一個java工程,為其添加上Spring開發能力后,創建一個ioc.test包,再分別創建電腦類(Computer)、主機類(Host)和顯示器類(Dispaly),為電腦類添加Host類型的屬性host和Display類型的屬性display,再添加一個run方法,讓電腦可以“運行”一起來。屬性代碼如下:
電腦類:
再給主機類添加一run方法,讓主機也可以“運行”,代碼如下:
下面便是修改Spring的配置文件,讓IoC容器為我們的“電腦”自動裝配“主機”和“顯示器了”。分別配置兩個bean,host和display。再配置一個名computer1的bean,autowire屬性設為byName,同理配置computer1和computer3,autowire屬性分別設為byType和default,最后設置<beans>標簽的default-autowire屬性為autodetect。至此,配置工作已經完成,可以看到,我們并沒有顯式的給computer bean它注入依賴對象host和display。配置代碼如下:
現在可以建立一個測試類來測試一下Spring時候真的為我們自動裝配好了我們需要的bean。代碼如下:
運行該類,輸出結果如下: 從運行結果可以看出,Spring IoC容器已經為我們自動的裝配好的“電腦”,從而配置文件簡潔了許多。但是,自動裝配并不是十全十美的,我們不論是使用byName還是byType的方法,Spring不一定就能很準確的為我們找到JavaBean依賴的對象。另外,如果使用自動裝配,Spring配置文件的可讀性也大大降低,我們不能很容易的看出個bean之間的依賴關系,這也在一定程度上降低了程序可維護性。因此在使用自動裝配時,應當權衡利弊,合理的與ref的方法相結合,盡量在降低工作量的同時,保證應用的可維護度。
殘夢追月
四川農業大學
專注于J2EE、J2ME開發,關注Spring、hibernate、Android等開源軟件……
E-mail:dashoumail@163.com