基于 <tx> 命名空间的声明式事务管理
来源:互联网 发布:松竹歌舞伎 知乎 编辑:程序博客网 时间:2024/06/07 23:32
基于 <tx> 命名空间的声明式事务管理
前面两种声明式事务配置方式奠定了 Spring 声明式事务管理的基石。在此基础上,Spring 2.x 引入了 <tx> 命名空间,结合使用 <aop> 命名空间,带给开发人员配置声明式事务的全新体验,配置变得更加简单和灵活。另外,得益于 <aop> 命名空间的切点表达式支持,声明式事务也变得更加强大。
如清单10所示:
清单10. 基于 <tx> 的事务管理示例配置文件
<beans......>......<bean id="bankService" class="footmark.spring.core.tx.declare.namespace.BankServiceImpl"><property name="bankDao" ref="bankDao"/></bean><tx:advice id="bankAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="transfer" propagation="REQUIRED"/></tx:attributes></tx:advice><aop:config><aop:pointcut id="bankPointcut" expression="execution(* *.transfer(..))"/><aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/></aop:config>......</beans>
如果默认的事务属性就能满足要求,那么代码简化为如清单 11 所示:
清单 11. 简化后的基于 <tx> 的事务管理示例配置文件
<beans......>......<bean id="bankService"class="footmark.spring.core.tx.declare.namespace.BankServiceImpl"><property name="bankDao" ref="bankDao"/></bean><tx:advice id="bankAdvice" transaction-manager="transactionManager"><aop:config><aop:pointcut id="bankPointcut" expression="execution(**.transfer(..))"/><aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/></aop:config>......</beans>
由于使用了切点表达式,我们就不需要针对每一个业务类创建一个代理对象了。另外,如果配置的事务管理器 Bean 的名字取值为“transactionManager”,则我们可以省略 <tx:advice> 的 transaction-manager 属性,因为该属性的默认值即为“transactionManager”。
基于 @Transactional 的声明式事务管理
除了基于命名空间的事务配置方式,Spring 2.x 还引入了基于 Annotation 的方式,具体主要涉及@Transactional 标注。@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。如清单12所示:
清单12. 基于 @Transactional 的事务管理示例配置文件
@Transactional(propagation = Propagation.REQUIRED)public boolean transfer(Long fromId, Long toId, double amount) {return bankDao.transfer(fromId, toId, amount);}
Spring 使用 BeanPostProcessor 来处理 Bean 中的标注,因此我们需要在配置文件中作如下声明来激活该后处理 Bean,如清单13所示:
清单13. 启用后处理Bean的配置
<tx:annotation-driven transaction-manager="transactionManager"/>
与前面相似,transaction-manager 属性的默认值是 transactionManager,如果事务管理器 Bean 的名字即为该值,则可以省略该属性。
虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 小组建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
基于 <tx> 命名空间和基于 @Transactional 的事务声明方式各有优缺点。基于 <tx> 的方式,其优点是与切点表达式结合,功能强大。利用切点表达式,一个配置可以匹配多个方法,而基于 @Transactional 的方式必须在每一个需要使用事务的方法或者类上用 @Transactional 标注,尽管可能大多数事务的规则是一致的,但是对 @Transactional 而言,也无法重用,必须逐个指定。另一方面,基于 @Transactional 的方式使用起来非常简单明了,没有学习成本。开发人员可以根据需要,任选其中一种使用,甚至也可以根据需要混合使用这两种方式。
- 基于 <tx> 命名空间的声明式事务管理
- 基于tx/aop命名空间的spring声明式事务管理
- Spring的声明式事务管理<tx:advice/> 有关的设置
- Spring的声明式事务管理<tx:advice/> 有关的设置
- Spring的声明式事务管理<tx:advice/> 有关的设置
- Spring基于声明式的事务管理
- 基于注解的声明式事务管理
- 基于 @Transactional 的声明式事务管理
- 命名空间的声明
- 配置spring事务管理的几种方式(声明式事务)----使用tx标签配置的拦截器
- Spring声明式事务管理(基于xml的方式)
- Spring声明式事务管理(基于注解的方式)
- 基于@Transactional注解方式的spring声明式事务管理
- spring声明式事务管理(基于TransactionProxyFactoryBean的方式)
- spring声明式事务管理(基于AspectJ的xml方式)
- 基于配置的Spring声明式事务管理详解
- Spring 声明式事务管理----基于TransactionProxyFactoryBean的方式
- Spring 声明式事务管理----基于AspectJ的XML方式
- Android layer type与WebView白屏以及WebView不随动画而动的问题
- BIN转HEX详解
- eclipse,tomcat不能部署项目,提示Project facet Java version 1.8 is not supported
- 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
- android自定义的notification
- 基于 <tx> 命名空间的声明式事务管理
- 92 js 根据li里面a标签href属性来匹配当前url
- Happy Number 数组变换循环判断
- Android上玩玩Hook:Cydia Substrate实战
- 浮动窗体 点击鼠标就出错
- Quartz.NET 入门
- Linux SVN 命令大全
- Fighting regressions with git bisect
- eclipse编码及创建servers问题