spring 声明式事务 @Transactional 运行原理

news2024/11/21 0:24:13

注意:如果想要理解spring 的声明式事务,必须先理解AOP 的原理。

一、spring注册 InfrastructureAdvisorAutoProxyCreator

  1. 通过 @EnableTransactionManagement 可以看到先把TransactionManagementConfigurationSelector通过@Import注册到spring。同时注意,mode 的默认值是 PROXY

在这里插入图片描述

  1. TransactionManagementConfigurationSelector间接 实现了 ImportSelector 接口,所以就有了将某个bean引入spring 的能力。会把 AutoProxyRegistrarProxyTransactionManagementConfiguration 引入到spring

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1gMSdOui-1674915716908)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/4.声明式事务原理/image-20230128212508609.png)]

  1. AutoProxyRegistrar 实现了ImportBeanDefinitionRegistrar,所以会用registry将bean注入到spring中。此处还是使用PROXY模式下的逻辑

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zVxHb9bG-1674915716909)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/4.声明式事务原理/image-20230128212719294.png)]

  2. 最终 registry会将 InfrastructureAdvisorAutoProxyCreatororg.springframework.aop.config.internalAutoProxyCreator为name注入到spring中。InfrastructureAdvisorAutoProxyCreator 和AOP 的AnnotationAwareAspectJAutoProxyCreator.class一样,也实现了 BeanPostProcessor接口,成为了spring 的 BeanPostProcessor后置处理器

在这里插入图片描述

二、特别注意

  1. 此处把 InfrastructureAdvisorAutoProxyCreatororg.springframework.aop.config.internalAutoProxyCreator为name注入到spring中。和 AOP 把 AnnotationAwareAspectJAutoProxyCreator.class注入到spring使用的BeanName是一样的。下面的两个调用会进入到同一个方法中。那么如果一个方法即使用 声明式事务、又使用 AOP 会如何?

在这里插入图片描述

  1. 在初始化这个类的时候就会定义好优先级。AOP的 AnnotationAwareAspectJAutoProxyCreator优先级最高,声明式事务 的 InfrastructureAdvisorAutoProxyCreator优先级最低。

在这里插入图片描述

  1. 具体的体现。如果一个方法即使用 声明式事务、又使用 AOP 。那么会使用AOP 的AnnotationAwareAspectJAutoProxyCreator.class,在AOP的后置处理器处理连接链
    在这里插入图片描述

三、InfrastructureAdvisorAutoProxyCreator分析

在这里插入图片描述

InfrastructureAdvisorAutoProxyCreator 是间接实现了 BeanPostProcessor接口。

四、获取代理对象

与AOP 获取代理对象是一样的。

五、ProxyTransactionManagementConfiguration 分析

一、2 中,除了往spring注册 AutoProxyRegistrar 还往spring中注册了 ProxyTransactionManagementConfiguration

在这里插入图片描述

  1. transactionAttributeSource() 主要是用来解析事务注解的属性

在这里插入图片描述

在这里插入图片描述

  1. transactionInterceptor(TransactionAttributeSource transactionAttributeSource)方法用来设置 动态代理时候的连接链,并把 TransactionManager事务管理器设置进去,到时好做 commit 或者 rollback

六、代理链

声明式事务的代理链只有一个链,所以没啥好分析的。与AOP的代理链一起分析更带劲。

二、特别注意中可知,如果一个方法即使用 声明式事务、又使用 AOP,那么最终会使用AOP的后置处理器。所以说最后的代理对象,也是使用同一个代理对象。所以说当调用 目标方法时进入到invoke 方法后可以看到拦截链。

在这里插入图片描述

很明显声明式事务 和AOP 的拦截链是混在一起的。而且是排在第一位的

在这里插入图片描述

七、声明式事务的代理链

框中的方法,其实 是在 各自的方法中调用 TransactionManager().commit 、 TransactionManager().rollback 等方法。与编程式事务无异。所以说声明式事务的底层是编程式事务

在这里插入图片描述

八、AOP 与 声明式事务 的调用过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-APOoXPke-1674915716914)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/4.声明式事务原理/5.aop实现原理下--代理过程.png)]

九、AOP 与 声明式事务 的调用逻辑

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fulqoOHR-1674915716915)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/4.声明式事务原理/6.aop调用链.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/183019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VULNCMS靶机

环境准备 靶机链接:百度网盘 请输入提取码 提取码:i3j0 虚拟机网络链接模式:桥接模式 攻击机系统:kali linux 2022.03 信息收集 1.查看靶机ip地址 2.探测目标靶机开放端口和服务情况。 nmap -p- -sV -A 192.168.1.108 漏洞…

嵌入式串行接口标准

在嵌入式系统中,经常使用UART接口实现通讯、调试日志数据等功能,但UART是一种异步通信协议,并未定义物理层的电气接口标准。 在板件通信时,UART接口之间通常基于IO直接连接进行通信(TTL/CMOS电平标准,3.3V电…

梦熊杯-十二月月赛-白银组题解-B.契约

B. Problem B.契约(contract.cpp) 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述: 「璃月」是「契约」的国度。 摩拉克斯认为&#xff0c…

Lua 字符串

Lua 字符串 参考至菜鸟教程。 字符串或串(String)是由数字、字母、下划线组成的一串字符。 Lua 语言中字符串可以使用以下三种方式来表示: 单引号间的一串字符。双引号间的一串字符。[[ 与 ]] 间的一串字符。 以上三种方式的字符串实例如下: string1 …

基于语义分割Ground Truth(GT)转换yolov5目标检测标签(路面积水检测例子)

基于语义分割Ground Truth(GT)转换yolov5目标检测标签(路面积水检测例子) 概述 许多目标检测的数据是通过直接标注或者公开平台获得,如果存在语义分割Ground Truth的标签文件,怎么样实现yolov5的目标检测…

【图论】求欧拉回路

前言 你的qq密码是否在圆周率中出现? 一个有意思的编码问题:假设密码是固定位数,设有nnn位,每位是数字0-9,那么这样最短的“圆周率”的长度是多少?或者说求一个最短的数字串定包含所有密码。 理论 一些…

acwing1264_动态求连续区间和

目录 算法分类: 问题描述 算法适用题目范围: 实现代码: 算法分类: 树状数组/线段树 问题描述 给定 n个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b]的连续和。 …

1602_MIT 6.828试验环境搭建

全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 最近尝试看一下MIT的操作系统教程,找到了一个6.828的课程。看了一下网络上的介绍,看起来这个大家的认可度还是很高的。开动之前&#xff0c…

Android面经_111道安卓基础问题(四大组件BroadCast、内容提供者篇)

该文章涉及的内容主要是:BroadCast、内容提供者; Android基础问题——四大组件之BroadCast、ContentProvider 内容提供者1、BroadCast1.1、Android的广播分类1.2、Android的广播注册方式1.3、广播作用域2、内容提供者Content provider2.1、什么是内容提供…

Google Protobuf 实践使用开发

Android 敏捷开发助手 Lottie动画 轻松使用PNG、JPG等普通图片高保真转SVG图Android 完美的蒙层方案Android MMKV框架引入使用强大无匹的自定义下拉列表Google Protobuf 实践使用开发 Protobuf 实践使用前言Protobuf基本介绍Protobuf 使用配置protobuf 基本语法1. 基本使用2. …

JavaWeb-Ajax

JavaWeb-Ajax 3,Ajax 3.1 概述 AJAX (Asynchronous JavaScript And XML):异步的 JavaScript 和 XML。 我们先来说概念中的 JavaScript 和 XML,JavaScript 表明该技术和前端相关;XML 是指以此进行数据交换。 3.1.1 作用 AJAX…

用Python绘制傅里叶级数和泰勒级数逼近已知函数的动态过程

文章目录Taylor级数Fourier级数本文代码: Fourier级数和Taylor级数对原函数的逼近动画Taylor级数 级数是对已知函数的一种逼近,比较容易理解的是Taylor级数,通过多项式来逼近有限区间内的函数,其一般形式为 f(x)∑n0Nanxnf(x)\su…

Lua 运算符 - 较为特殊部分

Lua 运算符 - 较为特殊部分 参考至菜鸟教程。 算术运算符 操作符描述实例^乘幂A^2 输出结果 100-负号-A 输出结果 -10//整除运算符(>lua5.3)5//2 输出结果 2在 lua 中,/ 用作除法运算,计算结果包含小数部分,// 用作整除运算,计…

Shiro学习文档

Shiro Java安全框架 1.什么是权限管理 ​ 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理…

oracle mysql postgresql opengauss 批量kill session

oracle alter system kill session sid,serial# immed; (根据v$session中查出sid和serial#进行替换) 这里提供一个常用脚本,支持跨实例kill会话 (替换&1条件或放到脚本调用都行) select alter system kill sessi…

Dubbo 简介

Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性&…

嵌入式工程师的2022 || 2023

因为一些个人关系,2022年初我从北京回到了石家庄。在找工作,包括后续的研发工作中,不同地点的经历在对比中我逐渐总结出了一些经验。关于“人”方面的感悟我就不赘述了,下面主要在这里总结一些找工作,做工作的经验&…

八、迁移学习和多任务学习

文章目录1、迁移学习2、多任务学习3、端到端学习THE END1、迁移学习 \qquad迁移学习是将某个任务学习到的知识(神经网络的参数信息)迁移到另外一个相似的任务中使用,从而重复利用相似任务学习共同之处,节省模型训练的时间,提高模型的训练效率…

一名普通22届本科毕业生|前端程序员|22年年终总结

文章目录22年上半年:最后的学生时光隔离实习币基金迷茫困惑难受不要去想人生意义读书景点环境的力量再次隔离返校入职前的学习22年下半年:上班工作生活总结本来准备在22年年末写的,奈何那段时间工作太忙没抽出时间。现在是23年的1月27日&…

paddleOCR代码工程的MD模式改造

一、下载cmake_3.22.3,用于生成vs工程 Index of /files/v3.22 下载完成,解压文件,打开cmake-gui.exe,即可使用: 二、下载Git(Git-2.36.0-64-bit.exe)并按照默认路径安装,cmake需调用…