基于泛型实现的Spring注入问题?

为了更加明确,可能贴的代码有点长,请见谅。

这里主要是打算应用泛型来做一些通常基本的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>
。。。。。。
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值