假设我有一个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>
现在我可以将它注入各种豆类,例如像这样:
@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;
}
}
虽然这有效但额外的类型演员很难看。
我认为有一个special handling for collections in Spring 4.2.5 (the currently most recent version)似乎会造成所有麻烦。当参数是扩展Collection
的接口时,它会创建特殊行为。因此,我可以使用Object
或具体实现作为参数类型来解决。
有没有办法直接将列表注入bean?怎么样?
答案 0 :(得分:0)
使用@Qualifier将使用给定的限定符注入bean。您可以将要成为bean的列表命名为可以正常工作的列表。