注入通用参数化属性的最佳解决方法是什么?
来自record in Spring Jira的简单示例:
@Component
public abstract class AbstractFoo<V extends Bar> {
@Autowired
protected V bar;
}
@Component
public ConcreteFoo1 extends AbstractFoo<ConcreteBar1> {
}
@Component
public ConcreteFoo2 extends AbstractFoo<ConcreteBar2> {
}
当我有这样的抽象AbstractFoo
类并尝试确定应该通过generecis(ConcreteFoo1
,ConcreteFoo1
注入的Spring bean时,Spring抛出异常,例如:
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'foo.ConcreteFoo1'
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
No unique bean of type [bar.Bar] is defined:
expected single matching bean but found 2: [concreteBar1, concreteBar2]
我在Spring 3.2.1中测试了类似的情节。 这个问题的最佳解决方法是什么?
此问题于2009年3月10日报道 为什么Spring中没有实现此功能?是否有任何并发症无法解决这种不足?
答案 0 :(得分:1)
就像你写的那样:
@Autowired
protected Bar bar;
Spring无法理解你想要注入ConcreteBar1
所以,你可以使用setter注入:
public abstract class AbstractFoo<V extends Bar> {
protected V bar;
}
@Component
public class ConcreteFoo1 extends AbstractFoo<ConcreteBar1>{
@Inject
private void setBar(ConcreteBar1 bar){
this.bar = bar;
}
}