什么有效
假设我有一个 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) {
// ...
}
}
然后我得到了所有类型的 bean 的列表String
而不是我定义的bean。然而,我实际上想将我的列表包装到一个不可修改的列表中,但这只有当我将我的依赖降级为列表时才可能实现。
目前发现解决方法
以下 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(当前最新版本)中对集合的特殊处理 https://github.com/spring-projects/spring-framework/blob/dd42a21f3968c165af924310fce460694803756f/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java#L1058这似乎造成了所有的麻烦。当参数是扩展的接口时,它会创建特殊行为Collection
。因此我可以通过使用解决方法Object
或作为参数类型的具体实现。
Question
有没有办法直接将列表注入到bean中?如何?