2008-01-15
基于泛型实现的Spring注入问题?
关键字: 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> 。。。。。。
评论
langkins
2008-01-16
后来想了想,这个问题确实还是比较navie。
我在action注入manager的setter方法中加入下边一行语句
super.manager = businessFlowManager就OK了。
我在action注入manager的setter方法中加入下边一行语句
super.manager = businessFlowManager就OK了。
langkins
2008-01-15
关于这个问题不知道是不是spring无法实现?
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 4011 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
使用ROR处理电子支付和视 ...
dzz1001 写道Active Merchant是否支持CCBILL和PAYC ...
-- by 花花公子 -
使用ROR处理电子支付和视 ...
Active Merchant是否支持CCBILL和PAYCOM等国外网关操作呢 ...
-- by dzz1001 -
使用ROR处理电子支付和视 ...
兄弟想接财付通的话,与我联系吧,算是对公司做点贡献吧。
-- by pypcjs -
HP面试经历
还是上海比较牛逼了。
-- by glamey -
使用ROR处理电子支付和视 ...
pypcjs 写道目前的电子支付平台非常成熟了,比如财付通,支付宝,快钱等,这些 ...
-- by gigix






评论排行榜