1. 程式人生 > >Spring的自動裝配 default-autowire="byName"

Spring的自動裝配 default-autowire="byName"

今天來整理一下Spring的自動裝配 autowire一節,在這裡我們要解決以下問題:
§1 什麼是自動裝配?
§2 自動裝配的意義?
§3 自動裝配有幾種型別?
§4 如何啟用自動裝配?
§5 自動裝配將引發的問題?



§1 什麼是自動裝配?  Spring IoC容器可以自動裝配(autowire)相互協作bean之間的關聯關係。因此,如果可能的話,可以自動讓Spring通過檢查BeanFactory中的內容,來替我們指定bean的協作者(其他被依賴的bean)。
簡而言之,就是對於bean當中引用的其他bean不需要我們自己去配置它改使用哪個類,Spring 的自動裝配可以幫助我們完成這些工作。

§2 自動裝配的意義?
引用 理解自動裝配的優缺點是很重要的。其中優點包括:

自動裝配能顯著減少配置的數量。不過,採用bean模板(見這裡)也可以達到同樣的目的。

自動裝配可以使配置與java程式碼同步更新。例如,如果你需要給一個java類增加一個依賴,那麼該依賴將被自動實現而不需要修改配置。因此強烈推薦在開發過程中採用自動裝配,而在系統趨於穩定的時候改為顯式裝配的方式。

§3 自動裝配有幾種型別?  
Spring
reference 寫道 5種模式 說明
no      預設不使用autowiring。 必須顯示的使用"<ref />"標籤明確地指定bean合作者,對於部署給予更大的
控制和明瞭。

byName 根據屬性名自動裝配。此選項將檢查容器並根據名字查詢與屬性完全一致的bean,並將其與屬性自
動裝配。例如,在bean定義中將 autowire設定為by name,而該bean包含master屬性(同時提供
setMaster(..)方法),Spring就會查詢名為master的bean定義,並用它來裝配給master屬性。

byType 如果容器中存在一個與指定屬性型別相同的bean,那麼將與該屬性自動裝配。如果存在多個該型別的
bean,那麼將會丟擲異常,並指出不能使用byType方式進行自動裝配。若沒有找到相匹配的bean,
則什麼事都不發生,屬性也不會被設定。如果你不希望這樣,那麼可以通過設定
dependency-check="objects"讓Spring
丟擲異常。

constructor 與byType的方式類似,不同之處在於它應用於構造器引數。如果在容器中沒有找到與構造器引數類
型一致的bean,那麼將會丟擲異常。

autodetect 通過bean類的自省機制(introspection)來決定是使用constructor還是byType方式進行自動裝配。
如果發現預設的構造器,那麼將使用byType方式。


§4 如何啟用自動裝配?
你可以參照以下的配置去啟用自動裝配
引用 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring
-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
default-autowire="byType" >
當然,這裡的byType你可以更改為其他你想要的裝配型別。

§5 自動裝配將引發的問題? 

自動裝配的一些缺點:

儘管自動裝配比顯式裝配更神奇,但是,正如上面所提到的,Spring會盡量避免在裝配不明確的時候進行猜測,因為裝配不明確可能出現難以預料的結果,而且Spring所管理的物件之間的關聯關係也不再能清晰的進行文件化。

對於那些根據Spring配置檔案生成文件的工具來說,自動裝配將會使這些工具沒法生成依賴資訊。

自動裝配可以減輕配置的工作量,但同時使得配置檔案的可讀性變得很差,因為你不可能從配置檔案
中獲知這些物件之間得依賴關係,從而維護困難!
注意:
當根據型別進行自動裝配的時候,容器中可能存在多個bean定義跟自動裝配的setter方法和構造器引數型別匹配。這樣就會存在模稜兩可的問題。如果bean定義不唯一,裝配時就會丟擲異常。
解決方案(任選其一):
1 放棄使用自動裝配,使用顯示裝配。
2 將bean排除在自動裝配之外,
引用
兩個功能:
1 通過設定bean定義中的'autowire-candidate'屬性顯式的設定為'true' 或 'false'來設定其是否為被自動裝配
物件。
2 使用對bean名字進行模式匹配來對自動裝配進行限制,其做法是在<beans/>元素的
'default-autowire-candidates' 屬性中進行設定。可以使用萬用字元,如以'Repository'結尾的bean,
那麼可以設定為"*Repository“。

3 通過在bean定義中設定'primary'屬性為'true'來將該bean設定為首選自動裝配bean。
如何使用Spring autowire請取決於你的專案設計。