使用Spring通过构造函数自动装配集合

时间:2010-07-29 15:36:30

标签: java spring annotations

我有一个似乎是一个简单的问题,正如标题中所述。这是我的课程类别:

public class Foo {
    @Autowired
    public Foo(@Qualifier("bar") Set<String> bar) {
        // ...
    }
}

我尝试使用以下弹簧上下文运行:

<context:annotation-config />
<util:set id="bar">
    <value>tata</value>
    <value>titi</value>
    <value>toto</value>
</util:set>
<bean id="foo" class="Foo" />

无法运行:

  

没有匹配类型的bean   找到[java.lang.String]   依赖[收集   java.lang.String]:预计至少为1   豆有资格作为autowire   这种依赖的候选人。   依赖注释:   {@ org.springframework.beans.factory.annotation.Qualifier(值=巴)}

请注意,如果我将其他参数添加到构造函数中,它可以正常工作。如果我使用setter注入,它工作正常。我确定我会错过一些明显的东西......你知道吗?

4 个答案:

答案 0 :(得分:22)

使用@Autowired注释无法自动装配集合。自动装配的集合意味着“提供特定类型的所有bean”。使用JSR-250 @Resource注释,您可以声明您希望按名称注入资源,而不是其类型。或者您明确注入依赖项。

  

[...]自身定义为集合或地图类型的bean无法通过@Autowired注入,因为类型匹配不适用于它们。对这样的bean使用@Resource,以唯一名称引用特定的集合/映射bean。

有关详细信息,请参阅the Spring documentation

答案 1 :(得分:5)

正如其他人所说,不可能将@Autowired用于字符串和字符串集合。假设你在版本3中有弹簧,你可以在这里使用带弹簧EL的@Value:

public class Foo {
    @Autowired
    public Foo(@Value("#{bar}") Set<String> bar) {
        // ...
    }
}

答案 2 :(得分:2)

认为这是因为Spring将集合的自动装配解释为“给我所有类型String的bean”,而不是“给我作为{的集合的bean” {1}}”。错误消息支持这个想法。

我认为你不能使用自动装配。如果没有在XML中手动连接它,我建议的最好的是:

String

答案 3 :(得分:2)

我遇到了同样的问题,并受到@rembisz's answer的启发。这个答案对我的Spring版本(4.1.3)没有影响。当我检查SpEL documentation on bean references时,我发现了一种不同的SpEL语法来表达对我有用的自动装配值中的bean引用 - @beanname。因此,以下代码对我有用:

public class Foo {
    @Autowired
    public Foo(@Value("#{@bar}") Set<String> bar) {
        // ...
    }
}