使用XML进行声明式事务管理
今天看了看Spring的声明式事务管理,写了一点小总结,希望对大家有帮助,本人也是刚开始学Spring,如果不到之处还望大家多多指导和指正,如果有问题QQ联系 1281027677, 转载请指明作者 使用XML进行声明式事务管理前言: Spring对于各种各样的ORM框架(包括JDBC)都可以它进行声明式事务管理,以下讲 解的是Spring对Hibernate的声明式事务管理,也是用的最多的; 一.导入命名空间并注入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. <beanid="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <propertyname="sessionFactory"> <refbean="mySessionFactory"/> </property> </bean> 注意: (1)使用HibernateTransactionManager类管理事务,其实这个类就相当于一个 aspect(切面类),运用了AOP原理; (2)这是作为公共使用的事务管理器Bean。这个会事先配置好,不需要各个模块各 自去配(也就是有多个spring配置文件时); (3)HibernateTransactionManager这个类怎么管理事务呢?这里就使用了 SessionFactory,从SessionFactory中获取连接,所以这里需要需要注入一个 SessionFactory; 三.通过<tx:advice>创建事务处理通知: <!--<tx:advice>需要设置一个TransactionManager,所以这里指定事务管理器--> <tx:adviceid="txAdvice"transaction-manager="txManager"> <!--通过<tx:attributes>设置相关属性--> <tx:attributes> <!--所有以get开头的方法,都是只读型事务--> <tx:methodname="get*"read-only="true"/> <!--所有以add开头的方法的事务传播性都设置为required--> <tx:methodname="add*"propagation="REQUIRED"/> </tx:attributes> </tx:advice> 四.配置使用事务通知的切入点: <aop:config> <aop:pointcutid="bussinessService" expression="execution(public*com.service..*.*(..))"/> </aop:config> 五.将事务通知与通知切入点组合: <aop:config> <!-- Advisor代表Spring中的Aspec,但是,与正常的Aspect不同, Advisor通常只持有一个Pointcut和一个Advice。所以,我们可以 认为Advisor是一种特殊的Aspect; <aop:advisor/>:将事务通知与切入点组合 --> <aop:advisoradvice-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> 讲解: <tx:advice>标签表示一个事务的advice(通知),它需要设置一个 TransactioinManager, 这里引用了txManager,在<tx:advice>内部使用<tx:aattributes> 来设置相关属性; 每一个<tx:method>表示设定一个需要纳入事务的方法,这里支持组配置, 在<tx:attributes>内部可以有多个<tx:method>,<tx:method>中可以配置 propagation(事务传播性设置)、isolation(事务的隔离级别)、timeout(事务超时)、 read-only(读写型事务后者只读型事务)等等..... 结合一个<aop:config>来配置事务,通过这里的<aop:config>中的<aop:advisor>将事 务通知(advice)和通知切入点(pointcut)组合; 总结: 1.使用XML方式还是使用Annotation方式来进行声明声明式事务管理? 虽然使用Annotation的方式比较简单,但是如果需要添加事务管理的方法比较多时, 这时候就会显得力不从心了,需要配置很多个@Transactional; 而使用XML的方式可以通过通配符的方式,一次为多个方法添加事务管理; 所以,大多数的情况下,都是使用XML的方式进行声明式事务管理;
分享是一种美德,谢谢大家的阅读,如果问题希望大家多多指正 ----- [大饼] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |