[英]How can I inject an instance of List in Spring?
假設我有一個ArrayList的spring bean定義:
<bean id="availableLanguages" class="java.util.ArrayList">
<constructor-arg>
<bean class="java.util.Arrays" factory-method="asList">
<constructor-arg>
<list>
<value>de</value>
<value>en</value>
</list>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
現在我可以將它注入各種bean中,例如:
@Controller
class Controller {
@Autowired
public Controller(ArrayList<String> availableLanguages) {
// ...
}
}
這非常有效。
但是,如果我稍微更改我的控制器並使用類型List
而不是ArrayList
如下所示:
@Controller
class Controller {
@Autowired
public Controller(List<String> availableLanguages) {
// ...
}
}
然后我得到一個String
類型的所有bean的列表,而不是我定義的bean。 但是我實際上想要將List包裝到一個不可修改的List中,但只有將我的依賴項降級到列表才能實現。
以下XML文件:
<bean id="availableLanguages" class="java.util.Collections" factory-method="unmodifiableList">
<constructor-arg>
<bean class="java.util.Arrays" factory-method="asList">
<constructor-arg>
<list>
<value>de</value>
<value>en</value>
</list>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
與此控制器一起使用:
@Controller
class Controller {
@Autowired
public Controller(Object availableLanguages) {
List<String> theList = (List<String>)availableLanguages;
}
}
雖然這有效但額外的類型演員是丑陋的。
我認為Spring 4.2.5(目前最新版本)中的集合有一個特殊處理,這似乎會造成所有麻煩。 當參數是擴展Collection
的接口時,它會創建特殊行為。 因此,我可以使用Object
或具體實現作為參數類型來解決。
有沒有辦法直接將列表注入bean? 怎么樣?
使用@Qualifier將使用給定的限定符注入bean。 您可以將要成為bean的列表命名為可以正常工作的列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.