`
langkins
  • 浏览: 34929 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

基于泛型实现的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>
。。。。。。
 

 

 

分享到:
评论
5 楼 langkins 2008-12-29  
很久前碰到的问题了,现在都不用spring了。
如果接口定义的好的话还是可以近似范型实现的。
4 楼 sigon 2008-12-25  
spring恐怕还没有实现泛型类型注入...
3 楼 daweiangel 2008-12-04  
今天也被这个问题困扰了好久
2 楼 langkins 2008-01-16  
后来想了想,这个问题确实还是比较navie。
我在action注入manager的setter方法中加入下边一行语句
super.manager = businessFlowManager就OK了。
1 楼 langkins 2008-01-15  
关于这个问题不知道是不是spring无法实现?

相关推荐

    再发一个基于Hibernate+Spring 泛型GenericDao 的工程源码.

    标题中的“基于Hibernate+Spring 泛型GenericDao”的工程源码指的是一个整合了Spring框架和Hibernate ORM技术的项目,其中使用了泛型设计模式来实现数据访问对象(DAO)。这个项目可能旨在提供一种通用、可复用且...

    Java反射、泛型和注解实战之Spring核心注入IOC的实现

    在本实战项目中,我们将深入探讨如何利用这些特性实现一个类似Spring框架的核心注入机制,即控制反转(Inversion of Control,简称IOC)。以下是关于这三个主题的详细讲解以及在Spring中的应用。 1. Java反射: ...

    ssh通用基于泛型的dao

    标题“ssh通用基于泛型的dao”指的是使用SSH(Spring、Struts2、Hibernate)框架开发的一个通用的、基于泛型的DAO实现,它旨在提高开发效率,减少重复工作。 SSH框架是Java企业级应用开发的常用组合,Spring提供了...

    Struts2 Spring3 Hibernate 注解功能 DAO 泛型 通用分页

    总的来说,"SSHWithAnnotationDemo"项目展示了如何利用现代Java技术栈的高级特性,包括Struts2、Spring3和Hibernate的注解功能,DAO层的泛型设计以及通用的分页实现,来构建一个高效、可维护的Web应用。这样的实践...

    Struts2+hibernate+spring整合泛型DAO

    然后,我们可以为每种实体类创建一个继承自`GenericDao`的实现类,如`UserDaoImpl`,并在Spring配置文件中声明并注入到Service层。这样,Service层就可以通过调用`UserDaoImpl`的方法,完成对用户表的操作,而无需...

    基于注解整合spring与hibernate

    这样,我们就完成了Spring和Hibernate的整合,实现了基于注解的低耦合、高可维护性的应用程序。 总之,基于注解的Spring与Hibernate整合简化了配置,提高了代码的可读性和可维护性。通过合理地使用各种注解,我们...

    泛型dao

    在Spring框架中,XML配置文件曾是配置组件和依赖注入的主要方式。例如,它可能会定义一个Hibernate的SessionFactory或Data Source,这样就可以在泛型DAO中使用这些配置来操作数据库。 总之,泛型DAO是Java开发中一...

    Spring demo 2017-04-18

    本次我们将通过"Spring demo 2017-04-18"的实例,深入探讨Spring的几个重要知识点,包括Bean的自动装配、AOP(面向切面编程)、泛型依赖注入以及JDBC的两种实现方式。 1. **Bean的自动装配**: Spring的自动装配...

    经典泛型dao层代码,非常好用简易

    然后,利用Spring的依赖注入(DI)特性,可以在Service层或其他组件中轻松注入泛型DAO的实例,从而实现对数据库的操作。 #### 结论 泛型DAO层为SSH框架下的数据访问提供了统一、高效且灵活的解决方案。通过上述...

    S2SH整合例子 注解配置 JSON 泛型Dao

    Struts2提供了MVC架构,Spring提供了依赖注入和事务管理,Hibernate则作为ORM工具处理数据库操作。 1. **Struts2**:Struts2是一个基于MVC设计模式的Web应用框架,它继承了Struts1的优点,并引入了更多现代框架的...

    Spring demo

    例如,可以创建一个泛型Repository接口,然后在Spring配置中,根据具体的实现类类型,Spring会自动匹配并注入相应的Bean。这样,我们就能够在不修改原有代码的情况下,轻松地替换或扩展服务层的实现。 再来看**Aop...

    spring2.0升级到spring3.0.5的开发包

    Spring框架是Java应用程序开发中的一个核心组件,它提供了一个丰富的IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)功能,使得开发者能够更方便地管理对象和实现模块化...

    SSH 泛型DAO分页

    2. **Spring**: Spring是一个全面的后端应用框架,核心特性是依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)。DI使得对象之间的关系在运行时动态绑定,增强了代码的灵活...

    Spring中文文档下载

    通过这些文档,开发者可以详细学习Spring框架的各个组件和最佳实践,掌握如何创建依赖注入、配置事务管理、实现AOP切面、整合数据库操作,以及构建RESTful Web服务等。深入理解并熟练应用Spring,将极大地提升Java...

    Spring1.x 和Spring2.x 版本上使用有什么区别

    而Spring2.x在依赖注入方面进行了扩展,增加了基于注解的依赖注入(@Autowired、@Qualifier等),使得代码更加简洁,降低了XML配置的复杂性。 2. **AOP增强** Spring2.x在面向切面编程(AOP)方面有了显著提升,引入...

    spring AOP 引入jar包,spring IOC 引入Jar包

    7. **泛型集合注入**:Spring 支持向 Bean 注入 List、Set、Map 等集合类型,方便处理多个依赖。 8. **工厂方法**:允许通过工厂方法来创建 Bean,提供更灵活的实例化策略。 在实际项目中,Spring AOP 和 Spring ...

    Spring3.0学习文档

    Spring的AOP支持基于代理的实现,包括静态代理和动态代理。 1. **静态代理**: 静态代理是在编译时就确定了代理类,适用于接口的代理,但当接口增加方法时,所有代理类都需要修改,维护成本高。 2. **Java动态...

    Hibernate泛型DAO及使用方法.doc

    在Spring框架中,我们可以使用依赖注入将`GenericHibernateDao`实例注入到服务层或者控制器中,通过配置文件或者注解来管理SessionFactory和事务,这样就实现了数据库操作的解耦和控制反转。 总的来说,泛型DAO是...

Global site tag (gtag.js) - Google Analytics