【发布时间】:2016-07-06 12:45:08
【问题描述】:
什么有效
假设我有一个 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。但是我实际上想将我的列表包装成一个不可修改的列表,但这只有在我将依赖项降级为列表时才有可能。
到目前为止发现的解决方法
以下 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 中?怎么样?
【问题讨论】:
-
您可以使用命名空间
util。看看thisasnwer。 -
@josivan:据我所知,这会改变我定义列表的方式。然而,列表的定义不是问题。是注入导致了问题,还是我错过了
util所做的任何事情? -
util:list是Spring上下文中的常规bean,可以正常注入。我注意到您混合使用了 Annotation 和 XML,然后托盘在构造函数中使用@Qualifier。例如@Qualifier("myList") -
我会使用像“LanguageList”这样的具体类型。我知道这不能回答你的问题,但它可能会解决你的问题。
-
几天前我遇到了同样的问题。检查它:stackoverflow.com/questions/6267138/spring-autowire-a-list。使用
@Resource注释而不是@Autowired,它会找到bean 但它的名称,而不是y 类型。
标签: java spring spring-ioc