Spring声明式事务(@Transactional)原理之-ProxyTransactionManagementConfiguration

 文章目录

目录

 文章目录

前言

一、切入点以及切面的匹配规则

1.1 TransactionAttributeSourcePointcut事务的切入点匹配

二、TransactionInterceptor切面的具体逻辑

2.1 声明式事务实现的具体逻辑

总结


 前言

  上一篇文章已经说过了声明式事务的原理其实就是SpringAop动态增强,而动态将切面织入切入点的逻辑在AbstractAdvisorAutoProxyCreator中,事务和普通的AOP分别由InfrastructureAdvisorAutoProxyCreatorAnnotationAwareAspectJAutoProxyCreator去完成织入。而方法匹配到切面的逻辑,以及的增强逻辑,如事务的开启和提交,则在具体的AdvisorPointcut中。想要详细的了解请看文章《Spring中申明式事务(@Transactional)实现的原理解析》

  本篇文章则针对具体的AdvisorPointcut进行申明式事务的具体增强逻辑的分析。


一、切入点以及切面的匹配规则

  上篇文章说过@EnableTransactionManagement注解通过@Import引入了两个类AutoProxyRegistrarProxyTransactionManagementConfiguration。AutoProxyRegistrar则是InfrastructureAdvisorAutoProxyCreator来创建AOP的代理对象,而ProxyTransactionManagementConfiguration则是用来注入切入点和切面的

这里是向Spring容器中注入了BeanFactoryTransactionAttributeSourceAdvisor,同时向这个Advisor中注入了TransactionAttributeSourceTransactionInterceptor。

1.1 TransactionAttributeSourcePointcut事务的切入点匹配

  顾名思义,这个类是一个Advisor,也就是切面类,里面配置了切入点匹配规则以及切面逻辑。看过上一篇文章应该会知道,在创建AOP的环节中需要查找所有切点中的符合Advisor类型的类。这个类正是事务的增强类。

这里面有一个切入点Pointcout,在这里的具体实现类为TransactionAttributeSourcePointcut

结合上一篇文章 《Spring中申明式事务(@Transactional)实现的原理解析》,如果方法满足:

  • pointCout.getClassFilter().matches(targetClass)返回true
  • pointCout.getMethodMatcher().matches(method, targetClass)返回true

则是该增强的一个切入点,就会织入切面逻辑。所以下面来看一下该Pointcut的匹配逻辑。

 可以看到Pointcut中的ClassFilter#match方法最终是调用了TransactionAttributeSource#isCandidateClass方法,在上面的第一张截图中,ProxyTransactionManagementConfiguration中在Advisor中注入了AnnotationTransactionAttributeSource,所以需要看这个TransactionAttributeSource中的方法。进入的TransactionAttributeSourced#isCandidateClass方法

最终调用的还是TransactionAnnotationParserisCandidateClass方法 。根据图一,TransactionAnnotationParser注入的具体实现类为AnnotationTransactionAttributeSource。进入该类查看具体的实现逻辑。

最终调用的是SpringTransactionAnnotationParser#isCandidateClass方法。

可以看出这里面是匹配了@Transactional注解,并且解析了注解里面的属性。

二、TransactionInterceptor切面的具体逻辑

2.1 声明式事务实现的具体逻辑

上面已经匹配到了植入点,接下来就是切面的具体逻辑了,而切面的具体逻辑就在TransactionInterceptor中。这里主要是invoke方法

主要得事务逻辑就在TransactionAspectSupport#invokeWithinTransaction方法中了。逻辑包括开启事务、执行方法、提交事务,有异常得时候回滚事务等


总结

事务和AOP其实是原理都是一样的,而事务的重点在于使用事务的时候需要注意事务的提交、回滚等,而声明式事务主要通过注解的属性或者一些默认配置来控制这些,我们只有理解了声明式事务的原理,才能更好更安全的去使用,后面会再针对声明式事务使用的时候需要注意的问题展开讨论,比如:事务失效、事务传播特性等

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

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

相关文章

P4 vscode 插件

Perforce for VS Code 并安装 Perforce:Client 填写perforce 客户端中你自己的workspace 名称Perforce:User p4的用户名Perforce:Password p4的密码Perforce:Port p4连接的服务器地址和端口, 例如 127.0.0.1:80 为了方便开发,对于代码工程&…

C语言基础:初识指针(二)

当你不知道指针变量初始化什么时,可以初始化为空指针 int *pNULL; 我们看NULL的定义,可以看出NULL是0被强制转化为Void* 类型的0;实质还是个0; 如何避免野指针: 1. 指针初始化 2. 小心指针越界 3. 指针指向空间…

2024五一杯ABC题资料合集+代码+参考论文!!!

一.赛题思路 (赛题出来以后第一时间在群内分享) 二.比赛日期和时间 比赛开始时间:2024年5月1日(周三)10;00 比赛结束时间:2024年5月4日(周六)12:00 三.将在明天分享的资料合集如下 4.我们这边会分享22年的题目完整全部的过程 5.数学建模的29个通用模型及MATLAB…

Python网络数据抓取(3):Beautiful Soup

Beautiful Soup 这个库通常被称为Beautiful Soup 4(BS4)。它主要用来从HTML或XML文件中抓取数据。此外,它也用于查询和修改HTML或XML文档中的数据。 现在,让我们来了解如何使用Beautiful Soup 4。我们将采用上一节中使用的HTML数据…

使用PaddlePaddle和Ernie模型来计算文本数据的向量表示

import paddle 2from paddlenlp.transformers import ErnieTokenizer, ErnieModel 3import numpy as np 4import json 5 6# 设置PaddlePaddle的全局随机种子 7paddle.seed(1234) 8 9# 初始化分词器 10tokenizer ErnieTokenizer.from_pretrained(ernie-3.0-tiny-medium-v2-zh) …

实验室温湿度设备巡检的意义

温湿度监控设备的正常运行对于实验室的科研工作来说至关重要,然而,我们常常会遇到设备出现故障或者探头不灵敏的情况,这给实验室的工作带来了诸多困扰,为了解决这些问题,对实验室温湿度设备进行巡检管理也是一种非常有…

前端vue如何生成二维码

有时候有需要链接直接生成二维码在手机上看的需求,比如下载,比如信息,比如excel 下面先引入包 import QRCode from qrcode; 然后上代码 // 将res转换成二维码const qrCodeData JSON.stringify(res); // 将res转换为字符串作为二维码数据// …

数据结构 -- 双向链表

谁说我没有死过? 出生以前, 太阳已无数次起落. 悠久的时光被悠久的虚无吞没, 又以我生日的名义卷土重来. --史铁生 目录 1. 前言2. 双向链表的结构3. 双向链表的实现4. 完整代码5. 总结 正文开始 1. 前言 双向链表是一种常见的数据结构,它与单向链表相比&#x…

Java+playwright+testNG实现UI自动化测试

今天来讲讲使用Java结合最新的playwright来做UI自动化测试 目前网上大部分都是关于使用Python做自动化的教程,Java的比较少一些,但是我认为使用Java做自动化还是有优点的,性能就好一点,当然大家根据实际需求来。 一、 普通UI测试 …

【python】去除水印的几种方式

1、python调用FFMEPG的delogo函数去除水印 要使用Python调用FFmpeg的delogo filter去除视频水印,你需要使用subprocess模块运行FFmpeg命令。以下是一个简单的Python脚本示例: import subprocessdef remove_watermark(input_video, output_video, logo_…

MacPro(M1,M2芯片)Java开发和常用工具开源软件合集

目录 Java开发软件1 IDE1.1 idea1.2 Vs Code 2 开发工具2.1 数据库数据库模型管理数据库连接客户端 2.2 SSH/Telnet/Serial/Shell/Sftp客户端2.3 MarkDown编辑器2.3 代码片段管理粘贴 3小工具3.1 截图贴图3.2 Mac下修改hosts文件的图形化界面软件 Java开发软件 1 IDE 1.1 ide…

如果把软路由的网段更换成169.254.0.0/16会咋样?

前言 这几天有小伙伴在折腾软路由系统,然后问题就来了。 他咨询的是:为啥电脑连接软路由之后,无法访问软路由的管理页? 嗯。。。确实不是什么大事。但不注意看,还以为软路由没有正常获取到ip。 熟悉网络的小伙伴们都…

教程推荐:手机应用自动化

手机应用程序的自动化通常涉及使用专门设计的自动化框架和工具。对于Android和iOS平台,以下是一些常用的自动化工具: Android: Espresso: Espresso是谷歌官方支持的自动化测试框架。它适用于写UI测试来模拟用户对Android应用的交云。Espresso工作在应用…

Python中的map()和filter()函数:深入解析与使用场景

Python中的map()和filter()函数:深入解析与使用场景 在Python编程中,map()和filter()是两个非常实用的内置函数,它们可以帮助我们更高效地处理数据。这两个函数都是高阶函数,可以接受一个函数作为参数,并应用于序列&a…

实例解释:溢出和进位是咋回事?不能胡来吧!

有学生给我一段程序,就在运行中标志位的“怪异”表现提出问题。   程序不难懂: assume cs:codesg codesg segment start:mov al,0fchadd al,05h ;结果不溢出mov al,0f5hadd al,87h ;结果溢出mov ax,4c00hint 21h codesg ends end start难懂的是&a…

设计模式- 访问者模式(Visitor Pattern)结构|原理|优缺点|场景|示例

设计模式(分类) 设计模式(六大原则) 创建型(5种) 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型(7种) 适配器…

leetcode-有效括号序列-94

题目要求 思路 1.使用栈的先进后出的思路,存储前括号,如果st中有对应的后括号与之匹配就说明没问题 2.有两个特殊情况就是字符串第一个就是后括号,这个情况本身就是不匹配的,还有一种是前面的n个字符串本身是匹配的,这…

Python中format的常见用法

一、填充 1、按默认顺序填充 name "Alice" age 25 print("My name is {} and I am {} years old.".format(name, age))输出:My name is Alice and I am 25 years old. 2、指定位置 name "Bob" age 30 print("My name is…

与Apollo共创生态:我们携手远航

目录 小程一言会议记录 回望7年发展展望未来小程有感 小程一言 4月22日,百度Apollo在北京车展前夕举办了以“破晓•拥抱智变时刻”为主题的智能汽车产品发布会。我在观看后也是很是触动 作为在校大学生的我,从大一开始知道Apollo开始,Apollo…

2024.04.09 校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、校招&实习 | 佑驾创新Minieye 春招补录实习(内推) 校招&实习 | 佑驾创新Minieye 春招补录实习(内推) 2、校招 | 上海复旦微电子…