自動裝配協作者
Spring容器可以自動裝配協作 Bean 之間的關係。你可以讓 Spring 透過檢查 ApplicationContext 的內容,自動為你的 Bean 解析協作器(其他 Bean)。自動裝配具有以下優點:
-
自動裝配可以顯著減少指定屬性或建構函式引數的需求。(本章其他地方討論的其他機制,例如 Bean 模板,在這方面也很有價值。)
-
隨著物件的演進,自動裝配可以更新配置。例如,如果你需要向類中新增依賴,該依賴可以自動滿足,而無需你修改配置。因此,自動裝配在開發過程中特別有用,並且不會否定在程式碼庫變得更穩定時切換到顯式裝配的選項。
使用基於 XML 的配置元資料(參見依賴注入)時,你可以使用 <bean/> 元素的 autowire 屬性為 Bean 定義指定自動裝配模式。自動裝配功能有四種模式。你可以為每個 Bean 指定自動裝配,從而選擇哪些 Bean 進行自動裝配。下表描述了四種自動裝配模式:
| 模式 | 解釋 |
|---|---|
|
(預設)不自動裝配。Bean 引用必須由 |
|
按屬性名稱自動裝配。Spring 查詢與需要自動裝配的屬性具有相同名稱的 Bean。例如,如果 Bean 定義設定為按名稱自動裝配,並且它包含一個 |
|
如果容器中存在且僅存在一個屬性型別的 Bean,則允許該屬性自動裝配。如果存在多個,則會丟擲致命異常,這表示你不能對該 Bean 使用 |
|
類似於 |
使用 byType 或 constructor 自動裝配模式,你可以裝配陣列和型別化集合。在這種情況下,容器中所有匹配預期型別的自動裝配候選都將用於滿足依賴。如果預期鍵型別是 String,則可以自動裝配強型別 Map 例項。自動裝配的 Map 例項的值由所有匹配預期型別的 Bean 例項組成,而 Map 例項的鍵包含相應的 Bean 名稱。
自動裝配的侷限性和缺點
自動裝配在整個專案中一致使用時效果最佳。如果通常不使用自動裝配,那麼僅使用它來裝配一兩個 Bean 定義可能會讓開發人員感到困惑。
考慮自動裝配的侷限性和缺點:
-
property和constructor-arg設定中的顯式依賴始終會覆蓋自動裝配。你不能自動裝配簡單屬性,例如基本型別、Strings和Classes(以及此類簡單屬性的陣列)。此限制是設計使然。 -
自動裝配不如顯式裝配精確。儘管如前面的表格所述,Spring 在可能出現意外結果的歧義情況下會謹慎避免猜測。你的 Spring 管理物件之間的關係不再明確記錄。
-
裝配資訊可能無法提供給可能從 Spring 容器生成文件的工具。
-
容器中的多個 Bean 定義可能與要自動裝配的 setter 方法或建構函式引數指定的型別匹配。對於陣列、集合或
Map例項,這不一定是問題。但是,對於期望單個值的依賴,這種歧義不會任意解決。如果沒有唯一的 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 屬性的顯式值 true 或 false 始終優先。對於此類 Bean,模式匹配規則不適用。
這些技術對於你永遠不想透過自動裝配注入到其他 Bean 中的 Bean 非常有用。這並不意味著被排除的 Bean 本身不能透過使用自動裝配進行配置。相反,該 Bean 本身不是自動裝配其他 Bean 的候選。
|
自 6.2 版起, 使用限定符時,標記為 相比之下, |