7.4.5 Autowiring collaborators

Spring容器能夠自動(autowire)關聯協做(collaborating)bean。您能夠經過檢查ApplicationContext的內容來容許Spring自動解析您的bean的協做者(其餘bean)。autowiring具備如下優勢:數組

  • 自動裝配能夠顯着減小指定屬性或構造函數參數的須要。
  • 自動裝配能夠隨着對象的發展而更新配置。例如,若是您須要向類添加依賴關係,則能夠自動知足該依賴關係,而無需修改配置。所以,自動裝配在開發過程當中特別有用,而在代碼庫變得更加穩定時,無需切換到顯式autowiring 。

當使用基於XML的配置元數據[2]時,您可使用<bean />元素的autowire屬性爲bean定義指定自動鏈接模式。自動連線功能有四種模式。您能夠指定每一個bean的自動佈線,所以能夠選擇要自動連線的。架構

Table 7.2. Autowiring modes函數

Mode Explanation

no      工具

(默認)無自動接線。 Bean引用必須經過ref元素定義。不建議更改默認設置用於較大的部署,由於明確指定協做者能夠更好地控制和清晰。在某種程度上,它記錄了系統的結構。 設計

byNa me     對象

按屬性名稱自動裝配。Spring會找到一個與須要自動連線的屬性名稱相同的bean。例如,若是bean定義經過名稱設置爲autowire,而且它包含master屬性(即具備setMaster(..)方法),Spring尋找一個名爲master的bean定義,並使用它來設置屬性。開發

byType文檔

若是容器中存在屬性類型的一個bean,則容許屬性自動鏈接。若是存在多個,則會拋出一個致命異常,這表示您可能不會對該bean使用byType自動連線。若是沒有匹配的bean,沒有任何反應;該屬性未設置。字符串

constructor部署

相似於byType,但適用於構造函數參數。若是在容器中沒有一個構造函數參數類型的bean,則會引發致命錯誤。

 使用byType或構造函數自動佈線模式,能夠對數組和類型集合進行連線。在這種狀況下,提供符合預期類型的​​容器內的全部自動連線候選者以知足依賴性。果預期的鍵類型爲String,則能夠自動鏈接強類型的Maps。自動連線的地圖值將包含與預期類型相匹配的全部bean實例,Maps鍵將包含相應的bean名稱。

您能夠將autowire行爲與依賴關係檢查相結合,這是自動連線完成後執行的。

 

Autowiring的侷限性和缺點

  • 屬性和構造器參數設置中的顯式依賴性老是覆蓋自動佈線。您不能自動鏈接所謂的簡單屬性,例如基元,字符串和類(以及這些簡單屬性的數組)。這個限制是按設計。
  • autowiring不如顯式接線精確。儘管如上表所示,雖然Spring很當心避免在可能出現意想不到的結果的歧義的狀況下進行猜想,可是您的Spring管理對象之間的關係再也不被明確記錄。
  • 對於可能會從Spring容器生成文檔的工具可能沒法使用接線信息。
  • 容器中的多個bean定義能夠匹配由setter方法指定的類型或構造函數參數以進行自動連線。對於數組,集合或地圖,這不必定是一個問題。然而,對於指望單個值的依賴性,這種模糊性不是任意解決的。然而,對於指望單個值的依賴性,這種模糊性不是任意解決的。若是沒有惟一的bean定義可用,則拋出異常。

從自動裝配中排除一個bean

在每一個bean的基礎上,您能夠將bean從自動裝配中排除。在Spring的XML格式中,將<bean />元素的autowire-candidate屬性設置爲false;容器使特定的bean定義不可用於自動佈線基礎架構(包括註釋樣式配置,例如@Autowired)。

相關文章
相關標籤/搜索