2015-12-22 98 views
2

空映射在我的@Configuration文件,我有豆類似於以下關係:進樣通過彈簧

@Bean 
public Cache<Foo,Bar> fooBarCache(Map<Foo,Future<Bar>> refreshTaskMap) { 
    return new AsyncUpdateCache(refreshTaskMap); 
} 

@Bean 
public Map<Foo,Future<Bar>> refreshTaskMap() { 
    return new HashMap<Foo,Future<Bar>>(); 
} 

然而,在ApplicationContext加載失敗,因爲它抱怨「式的[無合格的豆com.example.Bar]」。據我所知,Spring試圖爲我創建一張地圖時很可愛,並且假設我打算使用地圖來查找bean,或者類似的東西。

我該如何防止它試圖做它的集合注入「魔術」,只是注入了我聲明的bean?我試着在fooBarCache參數上添加一個@Qualifier註解,但這似乎沒有幫助。

+0

https://jira.spring.io/browse/SPR-12180 – chrylis

+1

如何調用refreshTaskMap()明確地fooBarCache(..)方法。像返回新的AsyncUpdateCache(refreshTaskMap()); – Lovababu

+0

@Lovababu的確是這樣......你應該把它當作答案;) – jgreen

回答

0

您可以使用其他方法來進行bean依賴注入 - 調用bean工廠方法而不是將其作爲參數(Spring doc)。那麼你的配置是這樣的:

@Bean 
public Cache<Foo,Bar> fooBarCache() { 
    return new AsyncUpdateCache(refreshTaskMap()); // call the method 
} 

@Bean 
public Map<Foo,Future<Bar>> refreshTaskMap() { 
    return new HashMap<Foo,Future<Bar>>(); 
} 

春天是足夠聰明,知道你要使用的refreshTaskMap,而不是簡單的調用方法和而不是創建一個新的和非託管的地圖實例將取代查詢現有的refreshTaskMap bean。這是進一步描述here

如果您打算自動裝配在其他豆類refreshTaskMap(此配置類外)的@Autowire Map<String, V>泉城語義自動裝配圖的類型V,其中鍵是bean名字的所有豆類(映射鍵類型必須是String)(reference

只要預期的鍵類型是字符串,即使鍵入的地圖也可以自動裝配。地圖值將包含預期的類型的所有豆類和按鍵將包含相應的bean的名字

在這種情況下,you should use @Resource:被自己定義爲一個集合或地圖類型

豆不能通過@Autowired注入,因爲類型匹配不適用於它們。對這些bean使用@Resource,通過唯一名稱引用特定的集合或映射bean。

+0

Doh!我應該想到直接調用該方法。感謝文檔參考。 – jgreen