`
wataxi
  • 浏览: 209011 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

(转)让Spring架构减化事务配置

阅读更多
让Spring架构减化事务配置
注:原创文章,曾发表在it168
Spring颠覆了以前的编程模式,引入了IOC等全新的概念,广受大家的喜爱。目前大多数j2ee项目都已经采用Spring框架。Spring最大的问题是太多的配置文件,使得你不仅需要维护程序代码,还需要额外去维护相关的配置文件。最典型的就是事务配置(注:这里的“事务配置”都指“声明式事务配置”),在Spring中进行事务配置除了定义对象自身的bean外,还需要定义一个进行事务代理的bean.如果你有n个类需要引入事务,那么你就必须定义2n个bean。维护这些bean的代价是十分昂贵的,所以必须要对事务配置进行减化。如果你是基于Spring进行架构设计,那么作为一个好的架构设计师,应该把一些公共的方面进行简化,让项目的开发人员只关心项目的业务逻辑,而不要花费太多的精力去关心业务逻辑之外的太多东西。所以作为一个好的架构就应该把事务管理进行简化,让程序员花在编程之外的工作最小化。

1.      Spring声明式事务配置的几种方法
在Spring中进行事务控制首先要选择适当的事务管理器,其次为程序选择划分事务的策略。如果只有单个事务性资源,可以从“单一资源”的PlatformTransactionManger实现当中选择一个,这些实现有:DataSourceTransactionManager,HibernateTransactionManager, JdoTransactionManager,PersistenceBrokerTransactionManager和JmsTransactionManager。根据你所采用的数据库持久化技术选择。如果你的项目运行于支持JTA的服务器,那么将选择JtaTransactionManger,将会支持多资源事务。
下表将为你选择适当的事务管理器提供参考。
技术                        事务管理器                                 内建的事务支持
JDBC                 DataSurceTransactionManager            JdbcTemplate和org.springframework.jdbc.object包中的所有类
                     JtaTransactionManager

IBATIS              DataSourceTransactionManager   SqlMapClientTemplate和SqlClientTemplate
                    JtaTransactionManager

Hibernate           HibernateTransactionManager                   HibernateTemplate和HibernateInterceptor
                    JtaTransactionManager
                                                

JDO                JdoTransactionManager                        JdoTemplate和JdoInterceptor
                   JtaTransactionManager
                                              

ApacheOJB         PersistenceBrokerTransactionManager          JtaTransactionManager
                  
                                               PersistenceBrokerTemplate
JMS              JmsTransactionManager                               JmsTemplate

在划分事务时,我们需要进行事务定义,也就是配置事务的属性。事务的属性有传播行业,隔离级别,超时值及只读标志。TransactionAttribute接口指定哪些异常将导致一个回滚,哪些应该一次性提交。
 

(1) 使用ProxyFactoryBean 和TransactionInterceptor
<!--定义本地数据源-->
<bean id="dataSource" name="dataSource" class="org.apache.commons.dbcp.BasicDataSource"           destroy-method="close">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>

<!-- !定义单个jdbc数据源的事务管理器-->
<bean id="transactionManager"               class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>
   <!—定义拦截器-->
<bean id="transactionInterceptor"
       class="org.springframework.transaction.interceptor.TransactionInterceptor">
     <property name="transactionManager">
      <ref bean="transactionManager"/>
     </property>
        <property name="transactionAttributes">
            <props>
                <prop key="insert*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
            </props>
        </property>
    </bean>
<!—定义业务对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService.target"
       class="com.prs.application.ehld.sample.biz.service.impl.SampleServiceImpl">
  <property name="userInfoDAO"
     ref="com.prs.application.ehld.sample.integration.dao.userInfoDAO">
   </property>
</bean>
<!—定义业务对象的事务代理对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService" class="org.springframeword.aop.framework.ProxyFacgtoryBean">
  <property name="target"
     ref="com.prs.application.ehld.sample.biz.service.sampleService.target">
  </property>
  <property name="interceptorNames">
     <value>transactionInterceptor</value>
  </property>
</bean>
通过ProxyFacgtoryBean和TransactionInterceptor组合使用,可以对事务进行更多的控制。所有需要事务控制的对象可以共享一个transactionInterceptor的事务属性。
(2) 使用TransactionProxyFactoryBean

  <!—定义业务对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService.target"
       class="com.prs.application.ehld.sample.biz.service.impl.SampleServiceImpl">
  <property name="userInfoDAO"
     ref="com.prs.application.ehld.sample.integration.dao.userInfoDAO">
   </property>
</bean>
    <!—定义业务对象的事务代理对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
          abstract="true">
        <property name="transactionManager">
            <ref bean="transactionManager"/>
        </property>
<property name="target"
          ref="com.prs.application.ehld.sample.biz.service.sampleService.target" />
        <property name="transactionAttributes">
            <props>
                <prop key="insert*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
            </props>
        </property>
    </bean>
使用TransactionProxyFactoryBean需要为每一个代理对象都去定义自己的事务属性。
(3) 使用TransactionProxyFactoryBean及abstract属性来简化配置
这种方工也是目前使用得最多的一种声明式事务配置方法

<!--事务控制代理抽象定义 -->
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
        abstract="true">
        <property name="transactionManager">
            <ref bean="transactionManager"/>
        </property>
        <property name="transactionAttributes">
            <props>
                <prop key="insert*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
            </props>
        </property>
    </bean>
  <!—定义业务对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService.target"
       class="com.prs.application.ehld.sample.biz.service.impl.SampleServiceImpl">
  <property name="userInfoDAO"
     ref="com.prs.application.ehld.sample.integration.dao.userInfoDAO">
   </property>
</bean>
<!—定义业务对象的事务代理对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService" parent="baseTransactionProxy">
  <property name="target"
     ref="com.prs.application.ehld.sample.biz.service.sampleService.target">
   </property>
</bean>

使用abstract属性,可以让代理对象可以共享一个定义好的事务属性,使配置简化。
(4)使用BeanNameAutoProxyCreator
    <!—定义拦截器-->
<bean id="transactionInterceptor"
       class="org.springframework.transaction.interceptor.TransactionInterceptor">
     <property name="transactionManager">
      <ref bean="transactionManager"/>
     </property>
        <property name="transactionAttributes">
            <props>
                <prop key="insert*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
                <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
            </props>
        </property>
    </bean>

<!—定义bean别名自动代理创建器-->
<bean id="autoProxyCreator"
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="interceptorNames">
        <value>transactionInterceptor</value>
    </property>
    <property name="beanNames">
      <list>
       <idref local="com.prs.application.ehld.sample.biz.service.sampleService"/>
      </list>
    </property>
</bean>
  <!—定义业务对象-->
<bean id="com.prs.application.ehld.sample.biz.service.sampleService"
       class="com.prs.application.ehld.sample.biz.service.impl.SampleServiceImpl">
  <property name="userInfoDAO"
     ref="com.prs.application.ehld.sample.integration.dao.userInfoDAO">
   </property>
</bean>


http://www.iteye.com/topic/72426#266179
分享到:
评论

相关推荐

    spring架构详解 spring架构详解

    Spring的AOP模块提供了在运行时对代码进行横切关注点(如日志、事务管理)的能力。它通过代理模式实现,可以将切面逻辑与业务代码分离,提高代码的复用性和模块化。 5. **设计模式** Spring框架广泛运用了多种...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版) .pdf

    《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》这本书主要聚焦于Spring框架的核心架构和技术细节,帮助读者全面理解Spring的工作机制、设计理念以及实现方式。下面将根据书名及其描述来展开相关知识点。 ...

    Spring技术内幕:深入解析Spring架构与设计原理

    《Spring技术内幕:深入解析Spring架构与设计原理》是一本由计文柯编著的书籍,专注于揭示Spring框架的核心机制和设计理念。这本书是为那些希望深入理解Spring如何工作,以及为何如此高效和灵活的开发者而准备的。...

    spring技术内幕第2版深入解析spring架构与设计原理

    在深入解析Spring技术内幕第2版中,会详细探讨Spring框架的核心架构与设计原理,Spring作为一个轻量级的Java平台,提供了全面的编程和配置模型,是企业级Java应用程序开发中广泛使用的技术之一。 Spring的核心特性...

    SPRING技术内幕:深入解析SPRING架构与设计原理

    《SPRING技术内幕:深入解析SPRING架构与设计原理》这本书是Java开发领域的一部重量级作品,由具有丰富开发经验的专家撰写,受到了Java开发者社区和Spring开发者社区的高度推崇。书中深入剖析了Spring框架的核心架构...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)+.pdf

    根据提供的文件标题“Spring技术内幕:深入解析Spring架构与设计原理(第2版)”和描述,我们可以了解到这是一本深入探讨Spring框架内部架构和技术细节的专业书籍。虽然标签中出现了“oracle”,但从标题和描述来看,...

    spring技术内幕-深入解析spring架构与设计原理

    《Spring技术内幕——深入解析Spring架构与设计原理》是一本深度剖析Spring框架核心机制与设计理念的专业书籍。本书旨在帮助读者全面理解Spring的内部工作原理,从而更好地应用和优化Spring框架在实际开发中的使用。...

    SPRING技术内幕+深入解析SPRING架构与设计 55M(下载地址)

    ### Spring技术内幕与深入解析Spring架构与设计 #### 书籍概述 本书《Spring技术内幕+深入解析Spring架构与设计》是一本专为Spring框架开发者所撰写的深度技术指南。作者凭借超过十年的Java开发经验,从Spring 3.0...

    SPRING技术内幕:深入解析SPRING架构与设计原理.pdf 下载

    根据提供的标题和描述,我们可以深入探讨Spring框架的核心架构与设计原理。...对于希望深入了解Spring架构与设计原理的学习者来说,《SPRING技术内幕:深入解析SPRING架构与设计原理》这本书是一个非常宝贵的资源。

    SPRING技术内幕:深入解析SPRING架构与设计原理.zip

    《SPRING技术内幕:深入解析SPRING架构与设计原理》这本书深入探讨了Spring框架的核心机制和设计理念,旨在帮助读者理解并掌握Spring的精髓。Spring作为Java企业级应用开发的重要工具,其灵活性、可扩展性和模块化的...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版).pdf

    总而言之,《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》这本书通过深入浅出的方式讲解了Spring框架的核心原理,不仅涵盖了其核心的IoC容器、AOP、事务管理、Spring MVC等组件,还探讨了Spring在数据...

    SPRING技术内幕:深入解析SPRING架构与设计原理_spring_

    《SPRING技术内幕:深入解析SPRING架构与设计原理》这本书深入探讨了Spring框架的核心机制、设计理念以及在实际开发中的应用。Spring作为Java领域最流行的轻量级框架,它的广泛应用和强大功能使得深入理解其工作原理...

    Spring技术内幕 - 深入解析Spring架构与设计原理.rar

    《Spring技术内幕 - 深入解析Spring架构与设计原理》这本书是IT领域的经典之作,专为想要深入了解Spring框架的开发者而准备。Spring作为Java领域最广泛应用的轻量级框架,其设计理念和实现机制一直是广大程序员关注...

    spring架构项目案例

    总结来说,"spring架构项目案例"是一个适合初学者的实践教程,涵盖了Spring 2.0的关键特性,包括依赖注入、AOP、Spring MVC、JDBC支持、事务管理和ORM集成。通过学习和实践这个项目,开发者可以掌握Spring的核心概念...

    深入解析Spring架构与设计原理.pdf

    《深入解析Spring架构与设计原理》是一本专为IT专业人士准备的深度学习Spring框架的书籍。Spring作为Java领域最广泛使用的轻量级框架之一,它的设计理念、核心组件以及实际应用都值得开发者深入研究。以下是对Spring...

    spring mvc 事务配置+异常处理

    接下来,我们将深入探讨Spring MVC中的事务配置和异常处理。 **1. Spring MVC 事务配置** 在Spring中,事务管理主要依赖于Spring的`PlatformTransactionManager`接口,它是所有事务管理器的基类。Spring提供了多种...

    Spring技术内幕:深入解析Spring架构与设计原理(完整版)

    总的来说,Spring架构的设计原则包括模块化、松耦合、可扩展性和易用性。通过理解这些原理,开发者可以更好地利用Spring框架,构建出更健壮、更易于维护的Java应用。无论你是初识Spring,还是寻求进一步提升,这本...

Global site tag (gtag.js) - Google Analytics