`

Spring Framework之最佳实践二

阅读更多

转载地址: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>

分享到:
评论

相关推荐

    Spring Framework v6.1.4.zip

    通过阅读源码,可以学习到设计模式、最佳实践以及如何编写高质量的Java代码。同时,对于想要自定义或扩展Spring功能的开发者,源码分析也极具价值。 总的来说,Spring Framework v6.1.4是一个强大的工具,不仅提供...

    Spring Framework v5.3.32.zip

    在下载并解压"spring-framework-5.3.32"后,开发者通常会查看源码,了解其内部工作原理,学习最佳实践,或者用于毕业设计项目中,以掌握现代企业级Java应用开发的核心技术。同时,这个版本的更新日志可能会包含重要...

    spring-framework-5.3.8

    在 5.3.8 版本中,测试工具和库可能已经升级,以适应新的测试框架和最佳实践。 8. **模块化**:Spring Framework 5.3.8 继续沿用了模块化设计,允许开发者根据需求选择引入必要的模块,降低项目的体积和启动时间。 ...

    spring-framework-5.3.20

    《Spring Framework 5.3.20:深度解析与应用...无论是传统的MVC模式,还是新兴的反应式编程,都能在Spring的怀抱中找到最佳实践。通过深入了解和熟练掌握Spring,开发者能够创建出高效、灵活且易于维护的企业级应用。

    官方源码 spring-framework-5.3.4.zip

    通过对Spring Framework 5.3.4源码的深入学习,开发者不仅可以提升自己的技术能力,还能了解到更多设计原则和最佳实践。这将有助于在实际项目中编写出更高效、可维护的代码,同时也能更好地参与到Spring社区的发展中...

    spring-framework-4.3.30.RELEASE-dist.zip

    对于学习和理解Spring框架的用法、配置以及最佳实践至关重要。通过阅读这些文档,开发者可以了解到Spring的核心概念、模块结构、配置方式以及如何将Spring集成到实际项目中。 2. **libs文件夹**:包含了一系列的jar...

    spring framework离线文档

    对于更现代的应用场景,Spring 4.1.0的英文参考文档(spring-framework-reference(4.1.0).pdf)会是宝贵的资源,它详细介绍了框架的高级特性和最佳实践。 在实际项目中,可以逐步学习并实践Spring MVC、数据访问、...

    SpringFrameWork 5.3.6.zip

    通过学习和实践Spring Framework 5.3.6,开发者可以掌握现代Java应用开发的最佳实践,包括模块化架构、声明式编程、反应式编程等。同时,Spring的广泛生态系统,如Spring Boot、Spring Cloud等,为构建微服务架构...

    官方原版完整包 spring-framework-5.3.3.RELEASE.zip

    Spring Framework 5.3.3 是一个广泛应用的Java企业级应用程序开发框架,它以其模块化设计、灵活性和强大的功能而闻名。...总的来说,Spring Framework 5.3.3 是一个强大且全面的工具集,是Java开发者的首选框架之一。

    spring-framework-bom源码

    Spring Framework 是一个广泛使用的Java应用程序开发框架,它提供了一个全面的编程和配置模型,促进了良好的编程实践和结构化的应用开发。...同时,这也是一次学习设计模式、编程原则和最佳实践的好机会。

    spring-framework-5.2.25.RELEASE.tar.gz

    Spring Framework是Java开发领域中最受欢迎的开源框架之一,以其模块化、松耦合和强大的功能特性,深受开发者喜爱。5.2.25.RELEASE作为Spring框架的一个稳定版本,为开发者提供了许多改进和新特性。本文将对这个版本...

    官方原版源码spring-framework-5.1.4.RELEASE.zip

    《Spring Framework 5.1.4源码深度解析》 Spring Framework是Java开发中的核心框架,它为构建高质量的企业级应用提供了全面的...通过深入研究源码,我们可以学习到软件设计的最佳实践,提升我们的编程技巧和架构能力。

    spring Framework 2入门经典源代码

    1. **依赖注入**:在Spring Framework 2中,依赖注入是其核心设计理念之一,它允许开发者解耦组件间的关联关系。通过容器管理对象的生命周期和它们之间的依赖,使得代码更易于测试和维护。开发者可以使用XML配置或...

    官方原版spring-framework-4.3.18.RELEASE.zip

    这些文档是开发者学习和理解Spring功能、最佳实践以及如何解决常见问题的重要资源。通过阅读文档,开发者可以深入了解Spring MVC、数据访问、事务管理、测试等模块的使用方法。 "spring-framework-4.3.18.RELEASE-...

    Spring Framework开发中文参考文档

    Spring Framework是中国广大Java开发者在进行企业级应用开发时不可或缺的框架工具。该框架以其轻量级、模块...开发者可以通过阅读这份文档,深入学习Spring的各种特性和最佳实践,从而提升其在Java开发领域的专业技能。

    电子书-Spring Framework 开发参考手册

    《Spring Framework 开发参考手册》是一本专注于Java开发者的权威指南,主要涵盖了Spring框架的核心概念、配置、使用方法以及最佳实践。Spring作为Java生态系统中的重要组成部分,为开发者提供了丰富的功能,包括...

    官方原版完整包 spring-framework-5.0.19.RELEASE.zip

    6. **文档资源**:压缩包内的`spring-framework-5.0.19.RELEASE-docs.zip`包含了详尽的官方文档,帮助开发者了解框架的使用方法和最佳实践,是学习和使用Spring Framework不可或缺的参考资料。 7. **XML与Java配置*...

    Spring Framework 4.1.0参考文档

    总的来说,Spring Framework 4.1.0参考文档详细介绍了Spring Framework各个方面的知识,从基础概念到高级特性,从模块划分到应用最佳实践,为开发者提供了全面的学习资源和指导。希望以上的详细知识点能够为使用...

    spring-framework-5.0.2.RELEASE 源码包

    深入研究Spring Framework 5.0.2.RELEASE的源码,开发者可以了解其实现细节,学习如何利用设计模式来构建可扩展和灵活的应用,同时也能掌握Java世界中的最佳实践。源码阅读有助于提升开发者的技术深度,为解决复杂...

    Spring Framework 开发参考手册.rar

    以上只是《Spring Framework 开发参考手册》的部分内容概览,实际手册中会有更详细的API介绍、示例代码和最佳实践指导,对于任何希望掌握Spring框架的开发者来说,都是一份不可或缺的学习资料。

Global site tag (gtag.js) - Google Analytics