【问题标题】:Dependency injection of Generic subtype with Spring使用 Spring 对 Generic 子类型进行依赖注入
【发布时间】:2016-06-29 07:35:51
【问题描述】:

我正在尝试将特定的 Generic bean 注入到 Generic 子类型,但 Spring 无法解决依赖关系。通过从 bean 中删除类型,一切都按预期工作。这是一个例子:

public class AbstractFrom{
    // ...
}

public class EmployyForm extends AbstractFrom{
    // ...
}

public class CompanyForm extends AbstractFrom{
    // ...  
}

abstract class AbstractBean<T extends AbstractFrom>{

    public abstract void calculate(T form); 
}

@Component
public CompanyBean extends AbstractBean<CompanyForm>{

    public void calculate(CompanyForm form){
        // specific impl
    }   
}

@Component
public EmployeeBean extends AbstractBean<EmployyForm>{

    public void calculate(EmployyForm form){
        // specific impl
    }   
}

这是一个目标类:

 @Service
    public BaseService{

        @Autowire
        public AbstractBean<AbstractFrom> baseBean; // <- NoSuchBeanDefinitionException

        // @Autowire
        // public AbstractBean baseBean; <- Injection works as is expected
    }

仅初始化 CompanyBeanEmployeeBean 的活动配置文件的依赖,从不同时初始化。我也尝试过给 bean 和我们的 @Qualifier 注释设置相同的名称。

是否存在如何使用菱形语法注入此 bean? Spring是否能够解决给定的依赖关系?使用 Spring 4.2.x。


编辑: 使用 Spring 4.3 应该是可能的。见Juergen Hoeller's talk

【问题讨论】:

  • 您是否尝试过自动连接public AbstractBean&lt;? extends AbstractFrom&gt; baseBean;

标签: java spring generics dependency-injection autowired


【解决方案1】:

我知道你可能不会喜欢这个,但为什么不将 EmployeeForm 和 CompanyForm 分离为 2 个独立的基本表单,然后在 BaseService 中为 Autowire 制作 TWO 个整体。

这本身不是 Spring 的答案,但这是我会做的,作为一种快速解决方法,看看它是否有效。 将它们分开并不是一个糟糕的设计妥协。

【讨论】:

  • 它会解决这个问题,但在我的情况下这不是解决方案,因为我必须复制很多代码。在可维护性方面,它是更糟糕的解决方案。还是谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-06-05
  • 2011-02-06
  • 2015-03-01
  • 1970-01-01
  • 2014-10-27
  • 2011-08-04
  • 2012-01-24
  • 1970-01-01
相关资源
最近更新 更多