在Spring中注入通用参数化属性

时间:2013-04-16 16:32:41

标签: spring generics dependency-injection autowired

注入通用参数化属性的最佳解决方法是什么?

来自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(ConcreteFoo1ConcreteFoo1注入的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中没有实现此功能?是否有任何并发​​症无法解决这种不足?

1 个答案:

答案 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;
}
}