为了更加明确,可能贴的代码有点长,请见谅。
这里主要是打算应用泛型来做一些通常基本的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>
。。。。。。
分享到:
相关推荐
标题中的“基于Hibernate+Spring 泛型GenericDao”的工程源码指的是一个整合了Spring框架和Hibernate ORM技术的项目,其中使用了泛型设计模式来实现数据访问对象(DAO)。这个项目可能旨在提供一种通用、可复用且...
在本实战项目中,我们将深入探讨如何利用这些特性实现一个类似Spring框架的核心注入机制,即控制反转(Inversion of Control,简称IOC)。以下是关于这三个主题的详细讲解以及在Spring中的应用。 1. Java反射: ...
标题“ssh通用基于泛型的dao”指的是使用SSH(Spring、Struts2、Hibernate)框架开发的一个通用的、基于泛型的DAO实现,它旨在提高开发效率,减少重复工作。 SSH框架是Java企业级应用开发的常用组合,Spring提供了...
总的来说,"SSHWithAnnotationDemo"项目展示了如何利用现代Java技术栈的高级特性,包括Struts2、Spring3和Hibernate的注解功能,DAO层的泛型设计以及通用的分页实现,来构建一个高效、可维护的Web应用。这样的实践...
然后,我们可以为每种实体类创建一个继承自`GenericDao`的实现类,如`UserDaoImpl`,并在Spring配置文件中声明并注入到Service层。这样,Service层就可以通过调用`UserDaoImpl`的方法,完成对用户表的操作,而无需...
这样,我们就完成了Spring和Hibernate的整合,实现了基于注解的低耦合、高可维护性的应用程序。 总之,基于注解的Spring与Hibernate整合简化了配置,提高了代码的可读性和可维护性。通过合理地使用各种注解,我们...
在Spring框架中,XML配置文件曾是配置组件和依赖注入的主要方式。例如,它可能会定义一个Hibernate的SessionFactory或Data Source,这样就可以在泛型DAO中使用这些配置来操作数据库。 总之,泛型DAO是Java开发中一...
本次我们将通过"Spring demo 2017-04-18"的实例,深入探讨Spring的几个重要知识点,包括Bean的自动装配、AOP(面向切面编程)、泛型依赖注入以及JDBC的两种实现方式。 1. **Bean的自动装配**: Spring的自动装配...
然后,利用Spring的依赖注入(DI)特性,可以在Service层或其他组件中轻松注入泛型DAO的实例,从而实现对数据库的操作。 #### 结论 泛型DAO层为SSH框架下的数据访问提供了统一、高效且灵活的解决方案。通过上述...
Struts2提供了MVC架构,Spring提供了依赖注入和事务管理,Hibernate则作为ORM工具处理数据库操作。 1. **Struts2**:Struts2是一个基于MVC设计模式的Web应用框架,它继承了Struts1的优点,并引入了更多现代框架的...
例如,可以创建一个泛型Repository接口,然后在Spring配置中,根据具体的实现类类型,Spring会自动匹配并注入相应的Bean。这样,我们就能够在不修改原有代码的情况下,轻松地替换或扩展服务层的实现。 再来看**Aop...
Spring框架是Java应用程序开发中的一个核心组件,它提供了一个丰富的IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)功能,使得开发者能够更方便地管理对象和实现模块化...
2. **Spring**: Spring是一个全面的后端应用框架,核心特性是依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)。DI使得对象之间的关系在运行时动态绑定,增强了代码的灵活...
通过这些文档,开发者可以详细学习Spring框架的各个组件和最佳实践,掌握如何创建依赖注入、配置事务管理、实现AOP切面、整合数据库操作,以及构建RESTful Web服务等。深入理解并熟练应用Spring,将极大地提升Java...
而Spring2.x在依赖注入方面进行了扩展,增加了基于注解的依赖注入(@Autowired、@Qualifier等),使得代码更加简洁,降低了XML配置的复杂性。 2. **AOP增强** Spring2.x在面向切面编程(AOP)方面有了显著提升,引入...
7. **泛型集合注入**:Spring 支持向 Bean 注入 List、Set、Map 等集合类型,方便处理多个依赖。 8. **工厂方法**:允许通过工厂方法来创建 Bean,提供更灵活的实例化策略。 在实际项目中,Spring AOP 和 Spring ...
Spring的AOP支持基于代理的实现,包括静态代理和动态代理。 1. **静态代理**: 静态代理是在编译时就确定了代理类,适用于接口的代理,但当接口增加方法时,所有代理类都需要修改,维护成本高。 2. **Java动态...
在Spring框架中,我们可以使用依赖注入将`GenericHibernateDao`实例注入到服务层或者控制器中,通过配置文件或者注解来管理SessionFactory和事务,这样就实现了数据库操作的解耦和控制反转。 总的来说,泛型DAO是...