如何使CDI根据bean的泛型类型决定使用的实现

时间:2014-11-03 16:53:45

标签: java generics cdi

这就是我的架构:

enter image description here

我想要实现的是让CDI在Controller中注入BO的正确实现,并在BO内部正确实现DAO,同时支持Controller的泛型类型。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

我使用javax.enterprise.inject.Instance对象解决了这个问题,以封装我的bo和dao's。这样:

@Inject
private Instance<CrudBO<T>> bo;

public CrudBO<T> getBo() {
    return bo.get();
}

为了说清楚,CrudBO是GenericCrudBO实现的接口,因此, 知道默认情况下GenericCrudBO是用@Default注释的,我用@Alternative注释了专门的类:

@Alternative
public class SpecializedCrudBO extends GenericCrudBO<SpecificClass>{
}

我还在beans.xml中声明了替代方案BO&#39;和

<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

    <alternatives>
        <class>com.kichel.marcos.business.SpecializedCrudBO</class>
        ...
    </alternatives>

</beans>

现在CDI可以在运行时处理我的通用java bean,这也非常好,因为我不需要创建大量的样板类。