用Spring依赖注入Generic子类型

时间:2016-03-14 10:08:13

标签: java spring generics dependency-injection autowired

我正在尝试将特定的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

1 个答案:

答案 0 :(得分:0)

我知道您可能不会喜欢这个,但为什么不将EmployeeForm和CompanyForm分离为2个单独的基本表单,然后在BaseService中为 TWO 提供自动链接。

这本身并不是Spring的答案,但这就是我要做的事情,作为一个快速的工作来看看它是否有效。 将它们分开并不是一种可怕的设计妥协。