什么有效
假设我有一个 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) {
// ...
}
}
然后,我得到了所有类型的 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(当前最新版本)中对集合进行了特殊处理,这似乎造成了所有麻烦。当参数是扩展的接口时,它会创建特殊行为Collection
。因此,我可以通过使用Object
或具体实现作为参数类型来解决问题。
问题
有什么方法可以直接将列表注入到 bean 中?如何?