使用XML进行声明式事务管理

来源:互联网 发布:下载网站的软件 编辑:程序博客网 时间:2024/05/16 07:57

今天看了看Spring的声明式事务管理, 写了一点小总结,希望对大家有帮助,本人也是刚开始学Spring,如果不到之处还望大家多多指导和指正,如果有问题QQ联系 1281027677, 转载请指明作者

使用XML进行声明式事务管理

前言:

Spring对于各种各样的ORM框架(包括JDBC) 都可以它进行声明式事务管理,以下讲  

解的是SpringHibernate的声明式事务管理,也是用的最多的;

一.导入命名空间并注入SessionFactory

   

1. spring配置文件中beans元素中:

  xmlns:tx="http://www.springframework.org/schema/tx"

  xsi:schemaLocation=”

   http://www.springframework.org/schema/tx 

   http://www.springframework.org/schema/tx/spring-tx-2.5.xsd

2.注入SessionFactory;    

二.配置Hibernate事务管理器

1.

 <bean  id="transactionManager" 

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory">

    <ref bean="mySessionFactory"/>

    </property>

  </bean>

注意:

    (1)使用HibernateTransactionManager类管理事务, 其实这个类就相当于一个  

       aspect(切面类),运用了AOP原理;

    (2)这是作为公共使用的事务管理器Bean。这个会事先配置好,不需要各个模块各

       自去配(也就是有多个spring配置文件时);

    (3)HibernateTransactionManager这个类怎么管理事务呢?这里就使用了

          SessionFactory,从SessionFactory中获取连接,所以这里需要需要注入一个     

        SessionFactory;

三.通过<tx:advice>创建事务处理通知:

 <!--  <tx:advice>需要设置一个TransactionManager, 所以这里指定事务管理器  -->

 <tx:advice id="txAdvice" transaction-manager="txManager">

<!--  通过<tx:attributes>设置相关属性 -->

<tx:attributes>

<!--  所有以get开头的方法,都是只读型事务  -->

<tx:method name="get*" read-only="true" />

<!--  所有以add开头的方法的事务传播性都设置为required  -->

<tx:method name="add*" propagation="REQUIRED" />

</tx:attributes>

</tx:advice>

  

四.配置使用事务通知的切入点:

<aop:config>
<!--  定义一个切入点 -->

<aop:pointcut id="bussinessService"

expression="execution(public * com.service..*.*(..))" />

</aop:config>

五.将事务通知与通知切入点组合:

<aop:config>

<!--  

Advisor代表Spring中的Aspec,但是,与正常的Aspect不同,

Advisor通常只持有一个Pointcut和一个Advice。所以,我们可以

认为Advisor是一种特殊的Aspect;

<aop:advisor />:将事务通知与切入点组合

 -->

<aop:advisor advice-ref="txAdvice" pointcut-ref="bussinessService" />

</aop:config>

 完整代码配置如下:

      <bean id="txManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager">  <property name="sessionFactory" ref="sessionFactory" />  </bean>    <tx:advice id="txAdvice" transaction-manager="txManager">  <tx:attributes>    <!--  所有以get开头的方法,都是只读型事务  -->  <tx:method name="get*" read-only="true" />  <!--  所有以add开头的方法的事务传播性都设置为required  -->  <tx:method name="add*" propagation="REQUIRED" />    </tx:attributes>  </tx:advice>    <aop:config>  <aop:pointcut id="bussinessService"  expression="execution(public * com.service..*.*(..))" />  <aop:advisor advice-ref="txAdvice" pointcut-ref="bussinessService" />  </aop:config>

 讲解:

       <txadvice>标签表示一个事务的advice(通知),它需要设置一个

     TransactioinManager,  这里引用了txManager,在<tx:advice>内部使用<tx:aattributes>

     来设置相关属性;

每一 个<txmethod>表示设定一个需要纳入事务的方法,这里支持组配置,

     在<txattributes>内部可以有多个<txmethod><txmethod> 中可以配置

 propagation(事务传播性设置)isolation(事务的隔离级别)timeout(事务超时)、   

 read-only(读写型事务后者只读型事务)等等.....

    结合一个<aop:config>来配置事务,通过这里的<aop:config>中的<aop:advisor>将事 

务通知(advice)和通知切入点(pointcut)组合;

总结:

   

   1.使用XML方式还是使用Annotation方式来进行声明声明式事务管理?

   

     虽然使用Annotation的方式比较简单,但是如果需要添加事务管理的方法比较多时,  这时候就会显得力不从心了,需要配置很多个@Transactional;

 

     而使用XML的方式可以通过通配符的方式,一次为多个方法添加事务管理;

     所以,大多数的情况下,都是使用XML的方式进行声明式事务管理;


分享是一种美德,谢谢大家的阅读,如果问题希望大家多多指正 ----- [大饼]