Spring源码解析--spring事务实现

我们在spring boot环境下查看事务的原理,spring boot的核心是自动化配置,我们找到事务的自动化配置类:
该类的路径是:
在这里插入图片描述
默认情况下:org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration这个类是事务的自动化配置类。
在这里插入图片描述
这个类为我们配置了事务相关的类,在这个类之前要首先配置一个自动化配置类
在这里插入图片描述

org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
在这里插入图片描述
该类的核心是为我们配置了DataSourceTransactionManager类型的Bean transactionManager,里面设置了dataSource,dataSource是我们自己在代码中提供的bean,
回到TransactionAutoConfiguration这个类中
在这里插入图片描述

这个类的主要作用是配置transactionTemplate,和开启代理方式。我们要特别注意@EnableTransactionManagement这个注解
在这里插入图片描述
这个注解为我们导入了一个TransactionManagementConfigurationSelector类,该类将为我们返回一个配置类ProxyTransactionManagementConfiguration,来看一下这个类的结构
在这里插入图片描述
这个类的核心是为我们配置了BeanFactoryTransactionAttributeSourceAdvisor,这是AOP中要使用的类。
TransactionAttributeSource 这个是注解解释器,用来判断类和方法上是否有@Transactional注解
TransactionInterceptor 这个是事物切面
在这里再介绍一下AOP的实现,基于注解的AOP,功能的实现主要依靠这个
org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.class类型的bean,该bean实现了BeanPostProcessor接口,在bean创建过程中为我们创建代理类。
在这里插入图片描述
这个类中会收集所有的 Advisor,自然也包括BeanFactoryTransactionAttributeSourceAdvisor。
在这里插入图片描述

我们来看一下Advisor生效的地方:
在这里插入图片描述
初步总结一下:
当我们引入事物相关的spring-tx.jar包后,位于spring-boot-autoconfigure.jar包下的事物的自动化配置类TransactionAutoConfiguration会生效,在这个类生效前生效的配置类DataSourceTransactionManagerAutoConfiguration会为我们配置好transactionManager,TransactionAutoConfiguration会为我们配置TransactionManagerCustomizers、TransactionTemplate类型的bean.在TransactionAutoConfiguration内部存在一个注解@EnableTransactionManagement,这个注解最终的作用是给我们引入了一个ProxyTransactionManagementConfiguration类型的配置类,这个配置类会为我们配置三个bean,分别是 TransactionInterceptor、TransactionAttributeSource、
BeanFactoryTransactionAttributeSourceAdvisor。BeanFactoryTransactionAttributeSourceAdvisor依赖于TransactionInterceptor、TransactionAttributeSource。
BeanFactoryTransactionAttributeSourceAdvisor的主要作用是利用AOP在有@Transactional注解的方法或者类上生成代理对象,在代理对象中使用TransactionInterceptor,对带有@Transcational注解的方法进行增强,就是添加事务。
下面我们来看一下TransactionInterceptor是如何对带有@Transactional注解的方法进行增强的:
在这里插入图片描述
TransactionInterceptor继承自TransactionAspectSupport,

TransactionInterceptor的invoke()方法最终调用的是TransactionAspectSupport.invokeWithinTransaction()
在这里插入图片描述
TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);创建事务

completeTransactionAfterThrowing(txInfo, ex);异常回滚事务

commitTransactionAfterReturning(txInfo);操作完成提交事务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值