[英]Autowiring a collection via the constructor with Spring
我有一個似乎是一個簡單的問題,正如標題中所述。 這是我的課程類型:
public class Foo {
@Autowired
public Foo(@Qualifier("bar") Set<String> bar) {
// ...
}
}
我嘗試使用以下spring語境運行:
<context:annotation-config />
<util:set id="bar">
<value>tata</value>
<value>titi</value>
<value>toto</value>
</util:set>
<bean id="foo" class="Foo" />
這無法運行:
沒有為依賴[java.lang.String的集合]找到匹配的類型為[java.lang.String]的bean:期望至少有一個bean可以作為此依賴項的autowire候選者。 依賴注釋:{@ org.springframework.beans.factory.annotation.Qualifier(value = bar)}
請注意,如果我將其他參數添加到我的構造函數中,它可以正常工作。 如果我使用setter注入,它工作正常。 我敢肯定我會錯過一些明顯的東西......你知道嗎?
使用@Autowired
注釋無法自動裝配集合。 自動裝配的集合意味着“提供特定類型的所有bean”。 使用JSR-250 @Resource
注釋,您可以聲明您希望按名稱注入資源,而不是其類型。 或者您明確地注入依賴項。
[...]自身定義為集合或地圖類型的bean不能通過
@Autowired
注入,因為類型匹配不適用於它們。 對這樣的bean使用@Resource
,通過唯一名稱引用特定的collection / map bean。
有關更多詳細信息,請參閱Spring文檔 。
正如其他人所說,不可能將@Autowired用於字符串和字符串集合。 假設你在版本3中有彈簧,你可以在這里使用帶彈簧EL的@Value:
public class Foo { @Autowired public Foo(@Value("#{bar}") Set<String> bar) { // ... } }
我認為這是因為Spring將集合的自動裝配解釋為“給我所有類型為String
bean”,而不是“給我作為String
集合的bean”。 錯誤消息支持該想法。
我不認為你可以使用自動裝配。 如果沒有在XML中手動連接它,我建議的最好的是:
public class Foo {
private @Resource Set<String> bar;
}
我有同樣的問題,並受到@ rembisz的答案的啟發。 這個答案對我的Spring版本(4.1.3)沒有用。 當我檢查關於bean引用的SpEL文檔時 ,我發現了一種不同的SpEL語法來表示對我@beanname
自動裝配值中的bean引用 - @beanname
。 因此,以下代碼對我有用:
public class Foo {
@Autowired
public Foo(@Value("#{@bar}") Set<String> bar) {
// ...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.