自動裝配協作者

Spring容器可以自動裝配協作 Bean 之間的關係。你可以讓 Spring 透過檢查 ApplicationContext 的內容,自動為你的 Bean 解析協作器(其他 Bean)。自動裝配具有以下優點:

  • 自動裝配可以顯著減少指定屬性或建構函式引數的需求。(本章其他地方討論的其他機制,例如 Bean 模板,在這方面也很有價值。)

  • 隨著物件的演進,自動裝配可以更新配置。例如,如果你需要向類中新增依賴,該依賴可以自動滿足,而無需你修改配置。因此,自動裝配在開發過程中特別有用,並且不會否定在程式碼庫變得更穩定時切換到顯式裝配的選項。

使用基於 XML 的配置元資料(參見依賴注入)時,你可以使用 <bean/> 元素的 autowire 屬性為 Bean 定義指定自動裝配模式。自動裝配功能有四種模式。你可以為每個 Bean 指定自動裝配,從而選擇哪些 Bean 進行自動裝配。下表描述了四種自動裝配模式:

表1. 自動裝配模式
模式 解釋

no

(預設)不自動裝配。Bean 引用必須由 ref 元素定義。不建議在大型部署中更改預設設定,因為顯式指定協作器可以提供更好的控制和清晰度。在某種程度上,它記錄了系統的結構。

byName

按屬性名稱自動裝配。Spring 查詢與需要自動裝配的屬性具有相同名稱的 Bean。例如,如果 Bean 定義設定為按名稱自動裝配,並且它包含一個 master 屬性(即,它有一個 setMaster(..) 方法),Spring 將查詢名為 master 的 Bean 定義並使用它來設定屬性。

byType

如果容器中存在且僅存在一個屬性型別的 Bean,則允許該屬性自動裝配。如果存在多個,則會丟擲致命異常,這表示你不能對該 Bean 使用 byType 自動裝配。如果沒有匹配的 Bean,則不執行任何操作(屬性未設定)。

constructor

類似於 byType,但適用於建構函式引數。如果容器中不存在且僅存在一個建構函式引數型別的 Bean,則會引發致命錯誤。

使用 byTypeconstructor 自動裝配模式,你可以裝配陣列和型別化集合。在這種情況下,容器中所有匹配預期型別的自動裝配候選都將用於滿足依賴。如果預期鍵型別是 String,則可以自動裝配強型別 Map 例項。自動裝配的 Map 例項的值由所有匹配預期型別的 Bean 例項組成,而 Map 例項的鍵包含相應的 Bean 名稱。

自動裝配的侷限性和缺點

自動裝配在整個專案中一致使用時效果最佳。如果通常不使用自動裝配,那麼僅使用它來裝配一兩個 Bean 定義可能會讓開發人員感到困惑。

考慮自動裝配的侷限性和缺點:

  • propertyconstructor-arg 設定中的顯式依賴始終會覆蓋自動裝配。你不能自動裝配簡單屬性,例如基本型別、StringsClasses(以及此類簡單屬性的陣列)。此限制是設計使然。

  • 自動裝配不如顯式裝配精確。儘管如前面的表格所述,Spring 在可能出現意外結果的歧義情況下會謹慎避免猜測。你的 Spring 管理物件之間的關係不再明確記錄。

  • 裝配資訊可能無法提供給可能從 Spring 容器生成文件的工具。

  • 容器中的多個 Bean 定義可能與要自動裝配的 setter 方法或建構函式引數指定的型別匹配。對於陣列、集合或 Map 例項,這不一定是問題。但是,對於期望單個值的依賴,這種歧義不會任意解決。如果沒有唯一的 Bean 定義可用,則會丟擲異常。

在後一種情況下,你有幾個選擇:

  • 放棄自動裝配,轉而使用顯式裝配。

  • 透過將其 autowire-candidate 屬性設定為 false 來避免對 Bean 定義進行自動裝配,如下一節所述。

  • 透過將其 <bean/> 元素的 primary 屬性設定為 true,將單個 Bean 定義指定為主要候選。

  • 實現基於註解的配置中提供的更細粒度的控制,如基於註解的容器配置中所述。

從自動裝配中排除 Bean

你可以按每個 Bean 的方式,將 Bean 從自動裝配中排除。在 Spring 的 XML 格式中,將 <bean/> 元素的 autowire-candidate 屬性設定為 false;使用 @Bean 註解時,該屬性名為 autowireCandidate。容器使該特定 Bean 定義對自動裝配基礎設施不可用,包括基於註解的注入點,例如@Autowired

autowire-candidate 屬性旨在僅影響基於型別的自動裝配。它不影響按名稱進行的顯式引用,即使指定的 Bean 未標記為自動裝配候選,這些引用也會得到解析。因此,按名稱自動裝配仍然會在名稱匹配時注入 Bean。

你還可以根據與 Bean 名稱的模式匹配來限制自動裝配候選。頂級 <beans/> 元素在其 default-autowire-candidates 屬性中接受一個或多個模式。例如,要將自動裝配候選狀態限制為名稱以 Repository 結尾的任何 Bean,請提供值 *Repository。要提供多個模式,請將它們定義為逗號分隔列表。Bean 定義的 autowire-candidate 屬性的顯式值 truefalse 始終優先。對於此類 Bean,模式匹配規則不適用。

這些技術對於你永遠不想透過自動裝配注入到其他 Bean 中的 Bean 非常有用。這並不意味著被排除的 Bean 本身不能透過使用自動裝配進行配置。相反,該 Bean 本身不是自動裝配其他 Bean 的候選。

自 6.2 版起,@Bean 方法支援兩種自動裝配候選標誌變體:autowireCandidatedefaultCandidate

使用限定符時,標記為 defaultCandidate=false 的 Bean 僅在存在額外限定符指示的注入點可用。這對於在某些區域應該可注入但不能妨礙其他地方相同型別的 Bean 的受限委託很有用。這樣的 Bean 永遠不會僅透過純宣告型別注入,而是透過型別加上特定限定符注入。

相比之下,autowireCandidate=false 的行為與上面解釋的 autowire-candidate 屬性完全相同:這樣的 Bean 根本不會透過型別注入。

© . This site is unofficial and not affiliated with VMware.