关于spring:spring事务简记

2次阅读

共计 1253 个字符,预计需要花费 4 分钟才能阅读完成。

spring 罕用的事务管理形式有 aspectj 与基于注解这两种,应用 aspectj 通过在 xml 配置文件中指定事务的流传级别,隔离级别,切入点 (须要加强的办法),切面等。配置较繁锁但能够做到我的项目不与框架耦合;基于注解只须要在进行事务管理的办法上应用 @Transactional,而后在 xml 文件中注明<tx:annotation-driven/> 就能够开启事务了。当然两种事务开启的入口都是通过 <tx:annotation-driven/> 实现的。

上面这里记录下应用 @Transactional 注解的形式:
tx:annotation-driven才是 Spring 事务的驱动,spring 会在 TxNamespaceHandler 注册相应的 parser,而后在 AnnotationDrivenBeanDefinitionParser 中对 annotation-driven 进行解决,解决后会失去一个名为 BeanFactoryTransactionAttributeSourceAdvisor 类型的 bean,并会将这个 bean 注册到到 BeanFactory 中,其理论为 Advisor 类型,这也是 Spring 事务可能通过 Aop 实现事务的根本原因。

Aop 在进行解析的时候,最终会生成一个 Adivsor 对象,这个 Advisor 对象中封装了切面织入所须要的所有信息,其中就包含最重要的两个局部就是 Pointcut 和 Adivce 属性。这里 Pointcut 用于判断指标 bean 是否须要织入以后切面逻辑;Advice 则封装了须要织入的切面逻辑。如下是这三个局部的简要关系图:

对于 Spring 事务,其既然是应用 Spring Aop 实现的,那么也同样会有这三个成员,Advisor 对应 BeanFactoryTransactionAttributeSourceAdvisor 类,而 Advice 对应 TransactionInterceptor 类,Pointcut 则对应 TransactionAttributeSourcePointcut 类,同样这三个类的关系如下:

这三个类的作用别离是:

  • BeanFactoryTransactionAttributeSourceAdvisor:封装了实现事务所需的所有属性,包含 Pointcut,Advice,TransactionManager 以及一些其余的在 Transactional 注解中申明的属性;
  • TransactionAttributeSourcePointcut:用于判断哪些 bean 须要织入以后的事务逻辑。这里可想而知,其判断的根本逻辑就是判断其办法或类申明上有没有应用 @Transactional 注解,如果应用了就是须要织入事务逻辑的 bean;
  • TransactionInterceptor:这个 bean 实质上是一个 Advice,其封装了以后须要织入指标 bean 的切面逻辑,也就是 Spring 事务是如果借助于数据库事务来实现对指标办法的盘绕的。

参考的文章:Spring 事务用法示例与实现原理

正文完
 0