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

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

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

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

   tata titi toto   

这无法运行:

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

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

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

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

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

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

公共课Foo {
     @Autowired
     public Foo(@Value(“#{bar}”)Set  bar){
         // ...
     }
 }

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

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

 public class Foo { private @Resource Set bar; } 

我有同样的问题,并受到@ rembisz答案的启发。 这个答案对我的Spring版本(4.1.3)不起作用。 当我检查关于bean引用的SpEL文档时 ,我发现了一种不同的SpEL语法来表示对我@beanname自动assembly值中的bean引用 – @beanname 。 因此,以下代码对我有用:

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