我有一个似乎是一个简单的问题,正如 Headers 中所述 . 这是我的课程类型:
public class Foo {
@Autowired
public Foo(@Qualifier("bar") Set<String> bar) {
// ...
}
}
我尝试使用以下spring语境运行:
<context:annotation-config />
<util:set id="bar">
<value>tata</value>
<value>titi</value>
<value>toto</value>
</util:set>
<bean id="foo" class="Foo" />
这无法运行:
找不到匹配[java.lang.String]类型的匹配bean依赖[java.lang.String的集合]:期望至少有一个bean可以作为此依赖项的autowire候选者 . 依赖注释:{@ org.springframework.beans.factory.annotation.Qualifier(value = bar)}
请注意,如果我将其他参数添加到我的构造函数中,它可以正常工作 . 如果我使用setter注入,它工作正常 . 我敢肯定我会错过一些明显的东西......你知道吗?
4 回答
使用
@Autowired
注释无法实现自动装配集合 . 自动装配的集合意味着"to provide all beans of a particular type" . 使用JSR-250@Resource
注释,您可以声明您希望按名称而不是其类型注入资源 . 或者您明确地注入依赖项 .有关详细信息,请参阅the Spring documentation .
正如其他人所说,不可能将@Autowired用于字符串和字符串集合 . 假设你在版本3中有 spring ,你可以在这里使用带 spring EL的@Value:
我认为这是因为Spring将集合的自动装配解释为“给我所有
String
", rather than "类型的bean给我一个String
集合的bean” . 错误消息支持该想法 .我不认为你可以使用自动装配 . 如果没有在XML中手动连接它,我建议的最好的是:
我有同样的问题,并受到@rembisz's answer的启发 . 这个答案对我的Spring版本(4.1.3)没有用 . 当我检查SpEL documentation on bean references时,我发现了一种不同的SpEL语法来表示对我有用的自动装配值中的bean引用 -
@beanname
. 因此,以下代码对我有用: