-
基于泛型实现的Spring注入问题?10
为了更加明确,可能贴的代码有点长,请见谅。
这里主要是打算应用泛型来做一些通常基本的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="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> 。。。。。。
问题补充
关于这个问题不知道是不是spring无法实现?
问题补充
后来想了想,这个问题确实还是比较navie。
我在action注入manager的setter方法中加入下边一行语句
super.manager = businessFlowManager就OK了。
问题补充
很久前碰到的问题了,现在都不用spring了。
如果接口定义的好的话还是可以近似范型实现的。2008年12月29日 22:39
相关推荐
标题中的“基于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是...