我试图创建一个通用抽象服务类,通过将服务层对象(DTO?),数据层实体及其对应的DAO 。如何在抽象类中使用泛型注入服务
DAO层是标准问题的抽象在我的DAO的扩展一个AbstractJpaImpl:
@Repository
public abstract class AbstractJpaBaseDaoImpl<K extends Serializable, E> implements BaseDao<K, E> {
//Dao implementation
}
的DAO的扩展此类和实现扩展BaseDao各自的DAO接口。
我希望在服务层创建类似的东西,但是我怎么注入dao本身呢?
public abstract class AbstractBaseCrudServiceImpl<K extends Serializable, B extends AbstractBaseCrudBean, P, D extends AbstractJpaBaseDaoImpl<K,P>>
implements BaseCrudService<K, B> {
protected Class<B> businessObject;
protected Class<P> persistObject;
protected Class<D> dao;
@SuppressWarnings("unchecked")
public AbstractBaseCrudServiceImpl() {
//Extract the class type by accessing this classes parameters by index <0,1...> so 0 is K and 1 is E.
this.businessObject = (Class<B>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];
this.persistObject = (Class<P>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[2];
this.dao = (Class<D>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[3];
}
//stuff ...
@Transactional
@SuppressWarnings("unchecked")
@Override
public void remove(B businessObject) {
logger.debug("Remove " + getBusinessObjectCanonicalName() + " id= " + businessObject.getId());
try {
getDao().remove(businessObject.getId()); //DOES NOT RECOGNIZE REMOVE METHOD
} catch (Exception e) {
logger.error("Unable to delete " + getBusinessObjectCanonicalName() + " record id=" + businessObject.getId(), e);
}
}
//stuff ...
}
什么是在这个抽象使用泛型注入服务最干净的方式?
D扩展AbstractJpaBaseDaoImpl不会削减它。有我可以遵循的模式吗?
是否有需要为您的服务和DAO增加通用性?为了“纯度”的缘故,这种感觉有点矫枉过正。根据我的经验,这通常是一个负面的ROI。 – 2011-05-14 23:17:35
随着每个粗加工功能的添加,似乎在服务层上重复工作。希望抽象这项工作,而不是复制和粘贴。帮助清理代码并减轻未来的增加。 – mosgjig 2011-05-15 23:15:53