我有一个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 注释来实现,强制处理器基于控制器的泛型类型注入正确实现的实例。谢谢