为了更加明确,可能贴的代码有点长,请见谅。
这里主要是打算应用泛型来做一些通常基本的CRUD操作,但是注入的时候出了点点问题。
我把基类部分注释掉以后可以正常工作,但是有一个问题,我每个具体的action类又必须重写BaseAction中的方法,因为manager没有得到注入,这样失去了使用泛型的意义。我把注释去掉以后在BaseAction中的“manager”无法按期望的方式的初始化。因为manager中的属性“persistentClass”永远都是在manager bean配置时设置的值,而不能变化,泛型就是需要变,我期望的是manager中该属性根据BusinessFlowDAO的构造注入时的参数而改变,该怎么做呢?
附:我参考的一篇文章 http://blog.csdn.net/brodie/archive/2007/08/14/1743275.aspx
下边是我的代码:
1、接口genericDao.java
public interface GenericDAO<T, ID extends Serializable> { T findById(ID id, boolean lock); List<T> findAll(); }
2、实现GenericHibernateDAO.java
public class GenericHibernateDAO<T, ID extends Serializable> extends HibernateDaoSupport implements GenericDAO<T, ID> { private Class persistentClass; public GenericHibernateDAO() { } public GenericHibernateDAO(Class persistentClass) { logger.debug("base class constructor " + persistentClass); this.persistentClass = persistentClass; } public Class getPersistentClass() { return persistentClass; } public void setPersistentClass(Class persistentClass) { this.persistentClass = persistentClass; logger.debug("persistentClass " + this.persistentClass); } @SuppressWarnings("unchecked") public T findById(ID id, boolean lock) { T entity; if (lock) // this.getHibernateTemplate().load(this.getPersistentClass(), id); entity = (T) getSession().get(getPersistentClass(), id, LockMode.UPGRADE); else entity = (T) getSession().get(getPersistentClass(), id); return entity; } @SuppressWarnings("unchecked") public List<T> findAll() { return findByCriteria(); }
3、service接口Manager.java
public interface Manager<T, ID extends Serializable> { public T findById(ID id, boolean lock); public List<T> findAll(); }
4、service实现ManagerImpl.java
public class ManagerImpl<T, ID extends Serializable> implements Manager<T, ID> { protected final Logger logger = Logger.getLogger(ManagerImpl.class); private GenericDAO genericDAO; @SuppressWarnings("unchecked") public T findById(ID id, boolean lock) { return (T) this.genericDAO.findById(id, lock); } @SuppressWarnings("unchecked") public List<T> findAll() { return (List<T>) this.genericDAO.findAll(); } }
5、扩展的业务Dao、service
public interface BusinessFlowDAO extends GenericDAO<BusinessFlow, Long>{ //TODO: add other method for business logic related to BusinessFlow }
public class BusinessFlowDAOHibernate extends GenericHibernateDAO<BusinessFlow, Long> implements BusinessFlowDAO { public BusinessFlowDAOHibernate(Class persistentClass) { super(persistentClass); logger.debug("child class constructor " + persistentClass); } }
public interface BusinessFlowManager extends Manager<BusinessFlow, Long>{ }
public class BusinessFlowManagerImpl extends ManagerImpl<BusinessFlow, Long> implements BusinessFlowManager { private BusinessFlowDAO businessFlowDAO; public BusinessFlowDAO getBusinessFlowDAO() { return businessFlowDAO; } public void setBusinessFlowDAO(BusinessFlowDAO businessFlowDAO) { this.businessFlowDAO = businessFlowDAO; super.setGenericDAO(businessFlowDAO); } }
baseAction如下:
public class BaseAction<T extends Identifiable<ID>, TForm, ID extends Serializable> extends DispatchAction { protected org.apache.log4j.Logger logger = org.apache.log4j.Logger .getLogger("action"); public T instance; public TForm tForm; protected Manager<T, ID> manager; @SuppressWarnings("unchecked") public ActionForward create(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { TForm tf = (TForm) form; try { instance = (T) ConvertUtil.convert(tf); this.manager.makePersistent(instance); } catch (Exception e) { e.printStackTrace(); logger.debug("create object exception " + e.toString()); } return null; } ...... }6、配置注入的代码 applicationContext.xml
<!--<bean id="genericDAO" class="com.wonders.persistence.GenericHibernateDAO"> <property name="persistentClass" value="java.lang.Object"></property> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <bean id="manager" class="com.wonders.service.impl.ManagerImpl"> <property name="genericDAO"> <ref bean="genericDAO" /> </property> </bean> <property name="persistentClass" value="com.wonders.persistence.config.BusinessFlow"> </property> --> <bean id="businessFlowDAO" class="com.wonders.persistence.config.dao.hibernate.BusinessFlowDAOHibernate"> <constructor-arg> <value>com.wonders.persistence.config.BusinessFlow</value> </constructor-arg> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <bean id="businessFlowManager" parent="txProxyTemplate"> <property name="target"> <bean class="com.wonders.service.impl.config.BusinessFlowManagerImpl" autowire="byName" /> </property> </bean> 。。。。。。