转载地址:http://www.gpowersoft.com/tech/Spring/46.htm
Spring Framework最得以出名的是与Hibernate的无缝链接,基本上用Spring,就会用Hibernate。可惜的是Spring提供的HibernateTemplate功能显得不够,使用起来也不是很方便。我们编程序时,一般先写BusinessService,由BusinessService调DAO来执行存储,在这方面Spring没有很好的例子,造成真正想用好它,并不容易。
我们的思路是先写一个BaseDao,仿照HibernateTemplate,将基本功能全部实现:
public class BaseDao extends HibernateDaoSupport{
private Log log = LogFactory.getLog(getClass());
public Session openSession() {
return SessionFactoryUtils.getSession(getSessionFactory(), false);
}
public Object get(Class entityClass, Serializable id) throws DataAccessException {
Session session = openSession();
try {
return session.get(entityClass, id);
}
catch (HibernateException ex) {
throw SessionFactoryUtils.convertHibernateAccessException(ex);
}
}
public Serializable create(Object entity) throws DataAccessException {
Session session = openSession();
try {
return session.save(entity);
}
catch (HibernateException ex) {
throw SessionFactoryUtils.convertHibernateAccessException(ex);
}
}
...
其它的DAO,从BaseDao继承出来,这样写其他的DAO,代码就会很少。
从BaseDao继承出来EntityDao,专门负责一般实体的基本操作,会更方便。
public interface EntityDao {
public Object get(Class entityClass, Serializable id) throws DataAccessException;
public Object load(Class entityClass, Serializable id) throws DataAccessException;
public Serializable create(Object entity) throws DataAccessException;
...}
/**
* Base class for Hibernate DAOs. This class defines common CRUD methods for
* child classes to inherit. User Sping AOP Inteceptor
*/
public class EntityDaoImpl extends BaseDao implements EntityDao{
}
为了Transaction的控制,采用AOP的方式:
public interface EntityManager {
public Object get(Class entityClass, Serializable id);
public Object load(Class entityClass, Serializable id);
public Serializable create(Object entity);
...
}
/**
* Base class for Entity Service. User Sping AOP Inteceptor
*/
public class EntityManagerImpl implements EntityManager {
private EntityDao entityDao;
public void setEntityDao(EntityDao entityDao) {
this.entityDao = entityDao;
}
public Object get(Class entityClass, Serializable id) {
return entityDao.get(entityClass, id);
}
public Object load(Class entityClass, Serializable id) {
return entityDao.load(entityClass, id);
}
...
}
这样我们就有了一个通用的Hibernate实体引擎,可以对任何Hibernate实体实现基本的增加、修改、删除、查询等。
其它的BusinessService就可以继承EntityManager,快速实现业务逻辑。
具体XML配置如下:
<!-- Oracle JNDI DataSource for J2EE environments -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>java:comp/env/jdbc/testPool</value></property>
</bean>
<!-- Hibernate SessionFactory for Oracle -->
<!-- Choose the dialect that matches your "dataSource" definition -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource"><ref local="dataSource"/></property>
<property name="mappingResources">
<value>user-hbm.xml</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.Provider</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.show_sql">false</prop>
</props>
</property>
</bean>
<!-- AOP DAO Intecepter -->
<bean id="hibernateInterceptor" class="org.springframework.orm.hibernate.HibernateInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="entityDaoTarget" class="com.gpower.services.entity.dao.EntityDaoImpl">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="entityDao" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.gpower.services.entity.dao.EntityDao</value>
</property>
<property name="interceptorNames">
<list>
<value>hibernateInterceptor</value>
<value>entityDaoTarget</value>
</list>
</property>
</bean>
<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<!-- Transaction manager that delegates to JTA (for a transactional JNDI DataSource) -->
<!--
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
-->
<!-- Transactional proxy for the Application primary business object -->
<bean id="entityManagerTarget" class="com.gpower.services.entity.EntityManagerImpl">
<property name="entityDao">
<ref bean="entityDao"/>
</property>
</bean>
<bean id="entityManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="target">
<ref bean="entityManagerTarget"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_SUPPORTS</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
分享到:
相关推荐
通过阅读源码,可以学习到设计模式、最佳实践以及如何编写高质量的Java代码。同时,对于想要自定义或扩展Spring功能的开发者,源码分析也极具价值。 总的来说,Spring Framework v6.1.4是一个强大的工具,不仅提供...
在下载并解压"spring-framework-5.3.32"后,开发者通常会查看源码,了解其内部工作原理,学习最佳实践,或者用于毕业设计项目中,以掌握现代企业级Java应用开发的核心技术。同时,这个版本的更新日志可能会包含重要...
在 5.3.8 版本中,测试工具和库可能已经升级,以适应新的测试框架和最佳实践。 8. **模块化**:Spring Framework 5.3.8 继续沿用了模块化设计,允许开发者根据需求选择引入必要的模块,降低项目的体积和启动时间。 ...
《Spring Framework 5.3.20:深度解析与应用...无论是传统的MVC模式,还是新兴的反应式编程,都能在Spring的怀抱中找到最佳实践。通过深入了解和熟练掌握Spring,开发者能够创建出高效、灵活且易于维护的企业级应用。
通过对Spring Framework 5.3.4源码的深入学习,开发者不仅可以提升自己的技术能力,还能了解到更多设计原则和最佳实践。这将有助于在实际项目中编写出更高效、可维护的代码,同时也能更好地参与到Spring社区的发展中...
对于学习和理解Spring框架的用法、配置以及最佳实践至关重要。通过阅读这些文档,开发者可以了解到Spring的核心概念、模块结构、配置方式以及如何将Spring集成到实际项目中。 2. **libs文件夹**:包含了一系列的jar...
对于更现代的应用场景,Spring 4.1.0的英文参考文档(spring-framework-reference(4.1.0).pdf)会是宝贵的资源,它详细介绍了框架的高级特性和最佳实践。 在实际项目中,可以逐步学习并实践Spring MVC、数据访问、...
通过学习和实践Spring Framework 5.3.6,开发者可以掌握现代Java应用开发的最佳实践,包括模块化架构、声明式编程、反应式编程等。同时,Spring的广泛生态系统,如Spring Boot、Spring Cloud等,为构建微服务架构...
Spring Framework 5.3.3 是一个广泛应用的Java企业级应用程序开发框架,它以其模块化设计、灵活性和强大的功能而闻名。...总的来说,Spring Framework 5.3.3 是一个强大且全面的工具集,是Java开发者的首选框架之一。
Spring Framework 是一个广泛使用的Java应用程序开发框架,它提供了一个全面的编程和配置模型,促进了良好的编程实践和结构化的应用开发。...同时,这也是一次学习设计模式、编程原则和最佳实践的好机会。
Spring Framework是Java开发领域中最受欢迎的开源框架之一,以其模块化、松耦合和强大的功能特性,深受开发者喜爱。5.2.25.RELEASE作为Spring框架的一个稳定版本,为开发者提供了许多改进和新特性。本文将对这个版本...
《Spring Framework 5.1.4源码深度解析》 Spring Framework是Java开发中的核心框架,它为构建高质量的企业级应用提供了全面的...通过深入研究源码,我们可以学习到软件设计的最佳实践,提升我们的编程技巧和架构能力。
1. **依赖注入**:在Spring Framework 2中,依赖注入是其核心设计理念之一,它允许开发者解耦组件间的关联关系。通过容器管理对象的生命周期和它们之间的依赖,使得代码更易于测试和维护。开发者可以使用XML配置或...
这些文档是开发者学习和理解Spring功能、最佳实践以及如何解决常见问题的重要资源。通过阅读文档,开发者可以深入了解Spring MVC、数据访问、事务管理、测试等模块的使用方法。 "spring-framework-4.3.18.RELEASE-...
Spring Framework是中国广大Java开发者在进行企业级应用开发时不可或缺的框架工具。该框架以其轻量级、模块...开发者可以通过阅读这份文档,深入学习Spring的各种特性和最佳实践,从而提升其在Java开发领域的专业技能。
《Spring Framework 开发参考手册》是一本专注于Java开发者的权威指南,主要涵盖了Spring框架的核心概念、配置、使用方法以及最佳实践。Spring作为Java生态系统中的重要组成部分,为开发者提供了丰富的功能,包括...
6. **文档资源**:压缩包内的`spring-framework-5.0.19.RELEASE-docs.zip`包含了详尽的官方文档,帮助开发者了解框架的使用方法和最佳实践,是学习和使用Spring Framework不可或缺的参考资料。 7. **XML与Java配置*...
总的来说,Spring Framework 4.1.0参考文档详细介绍了Spring Framework各个方面的知识,从基础概念到高级特性,从模块划分到应用最佳实践,为开发者提供了全面的学习资源和指导。希望以上的详细知识点能够为使用...
深入研究Spring Framework 5.0.2.RELEASE的源码,开发者可以了解其实现细节,学习如何利用设计模式来构建可扩展和灵活的应用,同时也能掌握Java世界中的最佳实践。源码阅读有助于提升开发者的技术深度,为解决复杂...
以上只是《Spring Framework 开发参考手册》的部分内容概览,实际手册中会有更详细的API介绍、示例代码和最佳实践指导,对于任何希望掌握Spring框架的开发者来说,都是一份不可或缺的学习资料。