天天看點

《Spring攻略(第2版)》——1.12 用@Autowired和@Resource自動裝配Bean

本節書摘來自異步社群《spring攻略(第2版)》一書中的第1章,第1.12節,作者: 【美】gary mak , josh long , daniel rubio著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

1.12.1 問題

在bean配置檔案中設定autowire屬性進行的自動裝配将裝配一個bean的所有屬性。這樣的靈活性不足以僅僅裝配特定的屬性。而且,你隻能通過類型或者名稱自動裝配bean。如果這兩種政策都不能滿足你的需求,就必須明确地裝配bean。

1.12.2 解決方案

從spring 2.5起,自動裝配功能進行了多處改進。你可以通過用@autowired或者@resource(在jsr-250:java平台常見注解中定義)注解一個設值方法、構造程式、字段甚至任意方法自動裝配特定的屬性。這意味着你除了設定autowire屬性之外,還有一個能夠滿足需求的選擇。但是,這種基于注解的選項要求你使用java 1.5或者更高版本。

1.12.3 工作原理

為了要求spring自動裝配具有@autowired或者@resource注解的屬性,你必須在ioc容器中注冊一個autowiredannotationbeanpostprocessor執行個體。如果你使用一個bean工廠,就必須通過api注冊這個bean後處理器,否則,你隻能在你的應用上下文裡聲明一個執行個體。

你也可以簡單地在bean配置檔案中包含元素,這将自動注冊一個autowiredannotationbeanpostprocessor執行個體。

自動裝配一個相容類型的bean

@autowired可以應用到一個特定的需要spring自動裝配的屬性。例如,你可以用@autowired注解prefixgenerator屬性的設值方法。然後,spring将試圖裝配一個類型與prefixgenerator相容的bean。

如果你在ioc容器中定義了一個與prefixgenerator類型相容的bean,它将自動地設定到prefixgenerator屬性上。

預設情況下,所有帶有@autowired的屬性都是必需的。當spring不能找到比對的bean進行裝配時,将會抛出一個異常。如果你希望某個屬性是可選的,将@autowired的required屬性設定為false。之後,當spring找不到比對的bean,将不設定該屬性。

除了設值方法之外,@autowired注解還可以應用到構造程式,spring将為每個構造程式參數尋找一個具有相容類型的bean。

@autowired注解還可以應用到一個字段,即使這個字段沒有聲明為public。這樣,你不能省略這個字段的設值方法或者構造程式的聲明。spring将通過反射把比對的bean注入這個字段。但是,用@autowired注解非公開的字段将降低代碼的可測試性,因為代碼将很難進行單元測試(黑盒測試法無法使用模拟對象之類的方式操縱這一狀态)。

你甚至可以将@autowired注解應用到具有任意名稱和任意數量參數的方法上,在這種情況下,spring将試圖為每個方法參數裝配一個類型相容的bean。

自動裝配所有相容類型的bean

@autowired注解還可以應用到一個數組類型的屬性上,讓spring自動裝配所有比對的bean。例如,你可以用@autowired注解一個prefixgenerator[]屬性。然後,spring将一次性自動裝配所有類型與prefixgenerator相容的bean。

如果你在ioc容器中有多個類型與prefixgenerator相容類型的bean,它們将自動被添加到prefixgenerators數組中。

相似地,你可以将@autowired注解應用類型安全的集合。spring能夠讀取這個集合的類型資訊,自動裝配所有類型相容的bean。

如果spring注意到@autowired注解應用到了一個關鍵字為字元串的類型安全java.util.map,它将在這個map中添加所有bean名稱與關鍵字相同的相容類型bean。

使用限定符的按類型自動裝配

預設情況下,按照類型的自動裝配在ioc容器中有超過一個類型相容的bean時無效。但是,spring允許你指定一個候選bean,這個bean的名稱在@qualifier注解中提供。

完成了這項工作,spring将會試圖在ioc容器中查找一個具有這個名稱的bean,将其裝配到這個屬性中。

你可以為自動裝配建立一個自定義的限定符注解類型。這種注解類型必須用@qualifier注解。如果你希望一種特殊的bean和配置在注解裝飾字段或者設值方法時注入,那麼就可以使用這種注解類型。

之後,你可以将這個注解應用到@autowired bean屬性。這将要求spring自動裝配帶有這個限定符注解和特定值的bean。

你必須向希望自動裝配到前述的屬性中的目标bean提供這個限定符。限定符由帶有type屬性的元素添加。限定符值在value屬性中指定。value屬性映射到注解的string value()屬性。

按照名稱自動裝配

如果你希望按照名稱自動裝配bean屬性,可以用jsr-250 @resource注解為一個設值方法、構造程式或者字段加上注解。預設情況下,spring将試圖找到一個與屬性同名的bean。但是你可以顯式地在name屬性中指定bean名稱。

注:

為了使用jsr-250注解,你必須包含jsr 250依賴。如果你使用maven,添加以下内容: