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