使用 Spring 通过构造函数自动布线集合

2022-09-02 01:20:43

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

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" />

此操作无法与 以下一起运行:

没有找到用于依赖项 [java.lang.String] 类型的匹配 Bean [java.lang.String] 的集合:预计至少有 1 个 bean 有资格作为此依赖项的自动连接候选项。Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=bar)}

请注意,如果我向构造函数添加其他参数,它可以正常工作。如果我使用设置器注射,它工作正常。我确定我错过了一些明显的东西...你知道吗?


答案 1

使用批注无法自动连接集合。自动连接的集合意味着“提供特定类型的所有豆子”。使用 JSR-250 注释,可以声明要按资源的名称(而不是类型)注入资源。或者,显式注入依赖项。@Autowired@Resource

[...]本身被定义为集合或映射类型的 bean 不能通过注入,因为类型匹配不能正确应用于它们。用于此类豆子,通过唯一名称引用特定集合/映射豆。@Autowired@Resource

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


答案 2

正如其他人所说,不可能将@Autowired用于字符串和字符串集合。您可以在此处将@Value与 spring EL 结合使用,前提是您在版本 3 中有 spring:

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

推荐