【问题标题】:Injection into generic parametrized property in Spring在 Spring 中注入通用参数化属性
【发布时间】:2013-04-09 04:06:28
【问题描述】:

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

来自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 注入的Spring bean(ConcreteFoo1ConcreteFoo1)时,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 中实现?是否有任何并发​​症阻止解决这一不足?

【问题讨论】:

    标签: spring generics dependency-injection autowired


    【解决方案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;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-13
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 2022-06-22
      • 1970-01-01
      • 2015-06-23
      相关资源
      最近更新 更多