1

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

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 中实现?是否有任何并发​​症阻止解决这个不足?

4

1 回答 1

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;
}
}
于 2013-04-28T05:51:06.480 回答