簡體   English   中英

使用Spring通過構造函數自動裝配集合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM