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

Gui*_*ume 22 java spring annotations

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

public class Foo {
    @Autowired
    public Foo(@Qualifier("bar") Set<String> bar) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下spring语境运行:

<context:annotation-config />
<util:set id="bar">
    <value>tata</value>
    <value>titi</value>
    <value>toto</value>
</util:set>
<bean id="foo" class="Foo" />
Run Code Online (Sandbox Code Playgroud)

这无法运行:

没有为依赖[java.lang.String的集合]找到匹配的类型为[java.lang.String]的bean:期望至少有一个bean可以作为此依赖项的autowire候选者.依赖注释:{@ org.springframework.beans.factory.annotation.Qualifier(value = bar)}

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

Chr*_*rau 23

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

[...] bean本身被定义为集合或映射类型,@Autowired因为类型匹配不适用于它们,所以无法注入.使用@Resource这样的豆子,通过唯一的名称指的是特定集合/图豆.

有关更多详细信息,请参阅Spring文档.


mre*_*isz 5

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

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