Spring 声明式事务

  • 前言
  • @EnableTransactionManagement
  • AutoProxyRegistrar
    • InfrastructureAdvisorAutoProxyCreator
  • ProxyTransactionManagementConfiguration
    • AnnotationTransactionAttributeSource(事务注解信息)
    • TransactionInterceptor(事务拦截器)
  • end...

前言

说起事务,其实现过程相信大家都很熟悉,只要给我们的方法加上 @Transactional 注解,就可以实现事务的功能了,因此,这里不再赘述事务的实现,本篇文章将对声明式事务的实现进行简单的源码分析。文章课程链接:尚硅谷spring注解驱动教程(雷神)

@EnableTransactionManagement

在分析AOP源码时,我们也是按照这个流程来进行的,首先分析开启功能的注解 @Enablexxx,这里就是 @EnableTransactionManagement ,点进这个注解,我们发现,它用 TransactionManagementConfigurationSelector 给容器导入组件,如图:

进入到 TransactionManagementConfigurationSelector 中,我们看看它导入了哪些组件,如图:

这里根据 adviceMode 来判断,如果是PROXY 就导入 AutoProxyRegistrar、ProxyTransactionManagementConfiguration 组件,我们发现 advice 是 EnableTransactionManagement 的一个属性,其默认值就是 PROXY(AdviceMode mode() default AdviceMode.PROXY;),因此,TransactionManagementConfigurationSelector 就导入了这两个组件,下面来分别分析这两个组件。

AutoProxyRegistrar

我们点进去,发现它实现了 ImportBeanDefinitionRegistrar ,就是给我们注册组件的,它会调用 registerBeanDefinitions() 方法,源码如图,首先是获取各种信息,获取了一个 mode,就是我们刚刚讲到 PROXY,因此,执行第二个红框下面的方法 AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry); 下面还有一个判断,这个值也是 EnableTransactionManagement 的一个属性,默认值为 false(boolean proxyTargetClass() default false;),因此不执行下面的方法

我们点到 AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry); 中,通过名称翻译,我们知道这是一个自动代理创建器,进来后是这样

继续跟进,进入方法registerOrEscalateApcAsRequired(InfrastructureAdvisorAutoProxyCreator.class, registry, source); 这里要注意,我们传入的第一个参数为 InfrastructureAdvisorAutoProxyCreator.class

这里我们就很熟悉了,跟AOP的源码逻辑一模一样,就是帮我们注册了一个名称为 org.springxx.xxx.internalAutoProxyCreator 的组件,类型为 InfrastructureAdvisorAutoProxyCreator,对应源码为倒数第二行。下面,我们对这个组件进行分析

InfrastructureAdvisorAutoProxyCreator

上面我们分析得出,# AutoProxyRegistrar
帮我们注册了一个 InfrastructureAdvisorAutoProxyCreator。我们点进去看看,这里给出源码图和继承关系图。


我们发现,它也是一个后置处理器,如红框,它有什么作用呐,这就和前面分析的AOP的原理一样了,利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用。

ProxyTransactionManagementConfiguration

分析完 AutoProxyRegistrar,我们继续分析导入的另一个组件,点进 ProxyTransactionManagementConfiguration,发现它是一个配置类(从名称也能看出),它又通过 @Bean 注册了各种组件,其中第一个是 BeanFactoryTransactionAttributeSourceAdvisor (事物增强器),下面,我们将依次分析它设置进去的值,这里第二行代码,它设置了一个事务属性,这个事务属性又在下面被注册的

AnnotationTransactionAttributeSource(事务注解信息)

我们跟进这个 AnnotationTransactionAttributeSource() 方法,点进来调用了 this(),调到了下面的方法,这个方法分别解析了 Spring 的事务注解解析器,Jta 的事务注解解析器和 Ejb3 的事务注解解析器。

下一步,我们进入到Spring 的事务注解解析器中,我们发现有一个注解解析器的方法,帮我们解析了事务注解中的各个属性值,包括 timeout、value等等。因此,这里就是利用 AnnotationTransactionAttributeSource 帮我们解析事务注解

TransactionInterceptor(事务拦截器)

同样的,我们分析第二个设置进去的值,它和 AnnotationTransactionAttributeSource 一样,都是通过 @Bean来注册的。这里它将事务属性信息保存起来,也将事务管理器保存了起来。

我们进入到 TransactionInterceptor,发现它实现了方法拦截器 MethodInterceptor,我们前面给容器中放了一个代理对象,现在需要执行目标方法了,这个方法拦截器就会帮我们拦截,执行拦截器链,我们看到,有一个 invoke() 方法,是不是很熟悉呐,AOP源码分析时就遇到了。

跟进 invoke() 方法中的 invokeWithinTransaction,首先它获取了事务属性和事务管理器,如何获取的可以自己点进去看看,这里简单说一下 TransactionManager 的获取,如果事先没有指定任何 TransactionManager,最终会从容器中按照类型获取一个,我的源码和视频中的已经有很大区别,在目标代码前面进行了几次判断,这里暂不深究,在我展示的else 代码块中,首先创建一个保存了 PlatformTransactionManager 的 txInfo,然后来到第一个红框(目标方法的执行),如果出现异常,catch 捕获,运行第二个红框,进行事务的回滚,如果没有问题,那么最后执行第三红框(提交事务)。

异常回滚方法代码截图:

提交方法代码截图


至此,我们的整个源码分析结束,其中的许多细节还需要我们去深究,下来要多花花时间打断点调试理解一下。

end…

如果总结的还行,就点个赞呗 @_@ 如有错误,欢迎指点,下一篇spring注解驱动开发-8 Spring 扩展原理···

spring注解驱动开发-7 Spring声明式事务相关推荐

  1. spring注解驱动开发-8 Spring 扩展原理

    Spring 扩展原理 前言 BeanFactoryPostProcessor 测试实例编写 ExtConfig MyBeanFactoryPostProcessor ExtTest 源码分析 Bea ...

  2. spring注解驱动开发-6 Spring AOP实现原理

    Spring AOP实现原理 前言 1.@EnableAspectJAutoProxy注解原理 2.AnnotationAwareAspectJAutoProxyCreator 分析 1.分析前工作, ...

  3. spring注解驱动开发-5 Spring AOP实现

    Spring AOP实现 前言 AOP案例实现 1.编写目标类 2.编写切面类 3.编写配置类 4.编写测试类 end... 前言 AOP为Aspect Oriented Programming的缩写 ...

  4. spring注解驱动开发-4 Spring 自动装配

    Spring 自动装配 前言 Spring 自动装配的几种方式 1.@Autowired @Qualifier("组件id") @Primary 2.@Resource方式 3.@ ...

  5. 【小家Spring】Spring注解驱动开发---向Spring Ioc容器中注册Bean的7种方式

    每篇一句 比你有钱的人一定会比你努力,而比你努力的人终有一天会比你有钱 前言 Spring是一个非常强大的反转控制(IOC)框架,以帮助分离项目组件之间的依赖关系.因此可以说Spring容器对Bean ...

  6. 0、Spring 注解驱动开发

    0.Spring注解驱动开发 0.1 简介 <Spring注解驱动开发>是一套帮助我们深入了解Spring原理机制的教程: 现今SpringBoot.SpringCloud技术非常火热,作 ...

  7. Spring注解驱动开发第26讲——总有人让我给他讲讲@EnableAspectJAutoProxy注解

    @EnableAspectJAutoProxy注解 在配置类上添加@EnableAspectJAutoProxy注解,便能够开启注解版的AOP功能.也就是说,如果要使注解版的AOP功能起作用的话,那么 ...

  8. Spring注解驱动开发学习总结8:自动装配注解@Autowire、@Resource、@Inject

    Spring注解驱动开发学习总结8:自动装配注解@Autowire.@Resource.@Inject 1.自动装配@Autowire.@Resource.@Inject 1.1 构建bookDao ...

  9. 【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解

    写在前面 最近,二狗子入职了新公司,新入职的那几天确实有点飘.不过慢慢的,他发现他身边的人各个身怀绝技啊,有Spring源码的贡献者,有Dubbo源码的贡献者,有MyBatis源码的贡献者,还有研究A ...

最新文章

  1. GAN还有这种操作!谷歌大脑和X实验室利用模拟条件和域适应提高机器抓取效率(附论文)
  2. oracle 11g goldengate DML单向复制测试环境搭建
  3. MVC中注册路由及其路由的设置
  4. 后门技术(HOOK篇)之DT_RPATH
  5. Mysql在大型网站的应用架构演变
  6. 第14章:傅里叶变换
  7. IntelliJ IDEA汉化版jar包
  8. pc电脑上浏览手机网站在线wap浏览器或模拟器软件
  9. 2021年茶艺师(中级)新版试题及茶艺师(中级)考试总结
  10. 前工程师讲解:开关电源设计-LLC电源
  11. douban movie top of Web Crawler
  12. 限时免费!2016杭州云栖大会抢票指南
  13. P6857 梦中梦与不再有梦
  14. 金蝉机器人_《金蝉脱壳2》残暴!机器人身份姓名首次曝光监狱更具压迫感
  15. (转载)页面静态化(JSP动态页面转静态化)
  16. linux装windows报错,安装Windows 和 Linux双系统(vmware) Centos7
  17. JS、JSP、JQuery区别
  18. 2021牛客寒假算法基础集训营1 E.三棱锥之刻
  19. CSS(五):定位与显示隐藏
  20. 可信计算原理浅析及平台构建

热门文章

  1. sjtuLib爬虫(一)
  2. 360浏览器:一键恢复收藏夹
  3. python(scipy)实现填充孔洞的方法(非常类似于MATLAB的imfill)
  4. 【IDA*】codevs 2495:水叮当的舞步
  5. python+opencv车道线,实线虚线的检测
  6. 数据仓库实践杂谈(七)——数据标准化
  7. 规则引擎 Drools:决策表
  8. [译]C# 7系列,Part 10: Spanlt;Tgt; and universal memory management Spanlt;Tgt;和统一内存管理
  9. python抢票代码_如何使用python爬取抢票?
  10. 中国服务器销售排名,IDC Q3:华为FusionServer Pro智能服务器发货量、销售额荣登中国区x86标准服务器排名双冠王...