首页 文章

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

提问于
浏览
21

我有一个似乎是一个简单的问题,正如 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 回答

  • 2

    使用 @Autowired 注释无法实现自动装配集合 . 自动装配的集合意味着"to provide all beans of a particular type" . 使用JSR-250 @Resource 注释,您可以声明您希望按名称而不是其类型注入资源 . 或者您明确地注入依赖项 .

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

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

  • 5

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

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

    我认为这是因为Spring将集合的自动装配解释为“给我所有 String ", rather than "类型的bean给我一个 String 集合的bean” . 错误消息支持该想法 .

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

    public class Foo {  
       private @Resource Set<String> bar;
    }
    
  • 22

    我有同样的问题,并受到@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) {
            // ...
        }
    }
    

相关问题