2011-05-14 191 views
1

我试图创建一个通用抽象服务类,通过将服务层对象(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不会削减它。有我可以遵循的模式吗?

+1

是否有需要为您的服务和DAO增加通用性?为了“纯度”的缘故,这种感觉有点矫枉过正。根据我的经验,这通常是一个负面的ROI。 – 2011-05-14 23:17:35

+0

随着每个粗加工功能的添加,似乎在服务层上重复工作。希望抽象这项工作,而不是复制和粘贴。帮助清理代码并减轻未来的增加。 – mosgjig 2011-05-15 23:15:53

回答

0

您可以尝试使用@PostConstruct注释的方法将基本抽象类中的变量与真实实例化的bean连接起来。这些抽象类可以包含基本的CRUd操作实现。下面提供了示例代码。我希望我以某种方式帮助你的查询。

@PostConstruct public void setupService() { 
    baseDao = userDao; 
} 
0

一些其他类型的定义是什么?如AbstractBaseCrudBean,BaseCrudService等?有太多的编译错误很难回答你的根本问题。

然而,简单的通用声明不削减的原因是,有在其上调用D的你会需要这样的东西的方法没有实例:

private final D dao; 

再装饰一个以@注入@Named(因为在擦除之后,您可能会拥有许多相同类型的DAO)。所以,DAO的每个实现都需要有一个唯一的字符串名称,这可能不是什么大不了的事情。

相关问题