1

我有一个GenericCrudController<E>封装 my 的实例GenericCrudBO<E>,而 myGenericCrudBO<E>封装了 my 的一个实例GenericCrudDAO<E>。所以,我想要做的是,例如,我GenericCrudController<User>默认情况下有 的实现GenericCrudBO<User>,如果有的话,当然。如果没有,我想坚持通用实现。我在项目中使用 CDI,我认为这是要走的路,但我不知道要使用什么注释。接下来是上述结构和场景:

public abstract class GenericController<T extends BaseEntity> implements Serializable {
    private static final long serialVersionUID = 1L;

    protected List<T> list;
    protected T entity;
    protected T filter;

    @Inject
    @Named("crudBO")
    protected CrudBO<T> bo;

    /*IRRELEVANT CODE GOES THERE */
}

@Named("crudBO")
public class GenericCrudBO<E extends BaseEntity> implements CrudBO<E>{
    private static final long serialVersionUID = 1L;

    @Inject
    @Named("crudDAO")
    protected GenericCrudDAO<E> dao;

    @Override
    @SuppressWarnings("unchecked")
    public List<E> search(E filter) {
        Class<E> clazz = (Class<E>) filter.getClass();
        return dao.search(clazz, filter);
    }

    /*IRRELEVANT CODE GOES THERE*/
}

@Named("crudDAO")
public class GenericCrudDAO<E extends BaseEntity> implements CrudDAO<E>{/*IRRELEVANT CODE GOES THERE*/}

这些是通用结构实现的一些示例:

public class UserBO extends GenericCrudBO<User>{
    /*IRRELEVANT CODE GOES THERE*/
    @Override
    public List<User> search(User filter) {
        /*SPEFIFIC CODE*/
    }
}

@Named(value="userController")
@ViewScoped
public class UserController extends GenericController<User>{ 

    @Inject private UserBO userBO;

    @Override
    public void search() {
        if(filter != null) {
            list = userBO.search(filter);
        } else throw new RuntimeException();
    }
}

现在请注意,我必须手动注入 UserBO 的实例并覆盖搜索方法才能实现调用 UserBO 的搜索方法而不是 GenericCrudBO 的目标。我要问的是是否可以使用一些 CDI 注释来实现,强制处理器基于控制器的泛型类型注入正确实现的实例。谢谢

4

1 回答 1

0

我使用 javax.enterprise.inject.Instance 对象来封装我的 bo 和 dao 解决了这个问题。这边走:

@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 和 DAO:

<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>br.com.logtec.business.SpecializedCrudBO</class>
        ...
    </alternatives>

</beans>

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

于 2014-11-03T18:40:07.103 回答