使用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}”)Setbar){ // ... } }
我认为这是因为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) { // ... } }
- 使用AnnotationProcessor构建Maven,解析src / main / java中的文件,并生成源代码到generate-test-sources / test-annotations
- Hibernate类强制转换exception
- 如何在类路径中找到具有特定方法注释的所有类?
- 如果我们在spring MVC中交换@service和@repository注释会发生什么
- 如何检查方法级弹簧安全性
- 当注释具有参数时,CDI拦截器不起作用
- Spring可以评估SpEL表达式中的所有字符/表达式,因为它们是从属性文件中注入的吗?
- 使用基于注释的配置创建延迟初始化的Spring bean
- Spring,使用@Configuration和@Bean注释