gpt4 book ai didi

java - CDI GenericDAO 和自定义实现

转载 作者:太空宇宙 更新时间:2023-11-04 06:08:31 26 4
gpt4 key购买 nike

我这里需要大脑! :p

我有一个接口(interface) IDAO< T ,K >,T 是实体类,K 是主键类。

我开发了一个具体的类 GenericDAO< T ,K > ,它提供 CRUD 操作和带有自动获取的条件查询(我创建了一个在实体关系上使用的方面 @Joinfetch )。如果您愿意,我可以显示代码,但这不是主题:)。

这里是生产 GenericDAO 的工厂:

public class GenericDAOProducer {

@PersistenceContext
EntityManager em;

@Produces
@Default
public <T, K> IDAO<T, K> producesGenericDAO(
final InjectionPoint injectionPoint) {
final ParameterizedType type = (ParameterizedType) injectionPoint
.getType();
// Because of the new, i got to inject the class and the entity manager
// manualy
final IDAO<T,K> dao = new GenericDAO<T, K>(this.em,
(Class) type.getActualTypeArguments()[0]);
dao.init(); //cool stuff here to prepare some criteria queries
return dao;
}
}

有时我需要 DAO 的另一种实现(例如复杂的获取)。这些实现也通过 IDAO 外观公开其方法。我希望这些 DAO 以与 GenericDAO 相同的方式注入(inject)。

以下是我想要的功能示例:

我需要在某处注入(inject) IDAO 的实现。如果存在一个类实现 IDAO< Person, Long> 那么我希望 CDI 选择这个实现。否则,如果 IDAO< Person, Long> 不存在实现,我希望 CDI 选择工厂生成的 GenericDAO< Person, Long >。

我很难用英语解释这一点。我希望你能理解我的问题。

您有这样做的最佳实践吗?

谢谢!

最佳答案

我需要两个@Qualifier

@Qualifier
@Retention(RUNTIME)
@Target({ METHOD, FIELD, PARAMETER, TYPE })
public @interface Generic {}


@Qualifier
@Retention(RUNTIME)
@Target({ METHOD, FIELD, PARAMETER, TYPE })
public @interface Specific {
Class<?> classe();
}

IDAO 界面

public interface IDAO<T, PK> extends Serializable {

public abstract T create(T entity) throws DAOException;

public abstract T edit(T entity) throws DAOException;

public abstract void remove(T entity) throws DAOException;

public abstract T find(PK id) throws DAOException;

public abstract T findWithFetch(PK id) throws DAOException;

public abstract List<T> findAll();

public abstract T getRef(PK id);
}

IDefaultDAO

public interface IDefaultDAO<T, PK> extends IDAO<T, PK> {
public void setEntityClass(final Class<T> entityClass);
}

抽象 DAO

public abstract class AbstractDAO<T, PK> implements IDAO<T, PK> {

@PersistenceContext
protected EntityManager em;

@Inject
protected transient Logger logger;

protected Class<T> entityClass;

protected final Class<T> getEntityClass() {
if (this.entityClass == null) {
this.entityClass = ((Class) ((ParameterizedType) this.getClass()
.getGenericSuperclass()).getActualTypeArguments()[0]);

}
return this.entityClass;
}

//methods implementations
}

默认 DAO

@Generic
public class DefaultDAO<T, PK> extends AbstractDAO<T, PK> implements
IDefaultDAO<T, PK> {

@Override
public void setEntityClass(final Class<T> entityClass) {
this.entityClass = entityClass;
}
}

特定的 DAO

@Specific(classe=Delegation.class)
public class DelegationDAO extends AbstractDAO<Delegation, Integer>
implements IDAO<Delegation, Integer> {
// do things differently
}

DAO 生产者

public class GenericDAOProducer {

@Inject
private transient Logger logger;

@Produces
public <T, PK> IDAO<T, PK> producesDAO(final InjectionPoint injectionPoint,
@Generic final IDefaultDAO<T, PK> genericDAO,
@Any Instance<IDAO<T, PK>> specDAOInstance) {

// JPA Class (T)
final ParameterizedType type = (ParameterizedType) injectionPoint
.getType();
final Class<T> entityClass = (Class) type.getActualTypeArguments()[0];

this.logger.info("Search DAO " + entityClass);

// Search specific DAO

specDAOInstance = specDAOInstance.select(new SpecificLiteral(
entityClass));

if ((specDAOInstance != null) && !specDAOInstance.isAmbiguous()
&& !specDAOInstance.isUnsatisfied()) {
this.logger.info("Implementation found! ");
return specDAOInstance.get();
} else {

this.logger
.info("Implementation not found! Return generic DAO."
+ entityClass);

genericDAO.setEntityClass(entityClass);
return genericDAO;
}
}
}

关于java - CDI GenericDAO 和自定义实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29029827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com