今天看了看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的方式进行声明式事务管理;
分享是一种美德,谢谢大家的阅读,如果问题希望大家多多指正 ----- [大饼]
原文链接:https://www.f2er.com/xml/300508.html