TransactionAspectSupport 源码解析

本文深入分析了Spring中的TransactionAspectSupport类,探讨其在事务管理中的作用。从功能需求出发,解释了为什么需要这个类以及它的主要功能。接着详细解读了类的结构、初始化过程和执行流程,包括事务属性源、事务管理器的选择以及如何封装方法执行以管理事务。TransactionAspectSupport作为切面支持,为子类提供了灵活的事务封装能力。
摘要由CSDN通过智能技术生成

前言

上一篇文章我们说了AbstractPlatformTransactionManager这个类,我们通过这个类实现了,根据事物属性开始事物,和根据事物状态提交事物,回滚事物,也就是事物的基本操作,提供了PlatformTransactionManager的实现
(ps : 上一篇文章,有人回复我,好开心呀,啦啦啦啦,这次的文章有疑惑也欢迎回复,我知道的都说!)

PlatformTransactionManager

功能分析 为什么

现在问题来了,我们每次写事物相关的操作,难道每次都要我们自己开启事物,然后在异常的时候自己回滚,正常时候在手动提交,这个就和jdbc一样,相同的代码,重复操作,如果是spring只实现到这一步,肯定就不是spring,因为他不是完整的生态,只是一个基础功能,所以spring肯定要给我们做进一步封装,封装为一个模板,我们只需要传入我们方法,在给你相关这个方法所有的事物属性,和事物管理器,剩下的我不管,至于什么时候开启,什么时候提交,什么时候回滚,正常来就行,最好还给我提供一下注册方法,事物状态变化时,比如提交的时候,你可以回调我。(ps:看了这么多源码,所谓的注册,好多都是建一个xxxxregister的类,里面包含一个或者多个集合,在提供循环依次调用集合中对象的指定方法,然后在子类的特定时间,调用这个方法,这个实现就是注册对象,然后在响应时刻触发指定方法)这样就完美了!我们看看这个我们要的这个类要做什么,拿到这个方法然后做一下操作

  1. 获取这个方法的事物配置,如果有的话
  2. 获取当前所用的事物管理mannage
  3. 完整的事物执行模板,就是包装方法的执行,并在合适的时候,开启或者提交回滚事物

从这个流程上看,我们可以看出,现在我们要一个method对应一个事物,那么transactionAttribute已经不可以满足我了,因为现在method现在和manage有关联关系。我们想想还要以下属性:

  1. 所属的PlatformTransactionManager
  2. 事物对应的事物属性transactionAttribute
  3. 给PlatformTransactionManager操作的事物状态transactionStatus
  4. 事物之间都是切换和包含关系的,所以有对应上一方法的 方法事物对象

好消息,天大好消息,spring居然给我们写好了,直接用就可以,不过他是TransactionAspectSupport不是TransactionSupport,多了一层切面的含义,也决定了这个类,是为了,子类通过aop方式更加灵活的实现事物封装做准备。下面上源码,看我们说的spring都做到了吗?

源码解析

public abstract class TransactionAspectSupport implements BeanFactoryAware, InitializingBean

抽象的,并且实现了BeanFactoryAware,和InitializingBean

  1. 抽象的,但是他本身没有任何没有实现的方法,所以他的类名没有抽象,但是因为他是为了做切面,所以必须要子类序列化,不然不可以用,所以是抽象的
  2. 实现了BeanFactoryAware 应为他支持使用spring中的bean,做配置
  3. 实现了InitializingBean ,bean实例化后调用,做初始化检查,看看这个对象是否完整可用

然后直接以我们说的事物对象来看看他的另一个重要类 TransactionInfo,就是spring对我们说的事物对象的实现,除了包含我们的说的以外,还包含一个字段叫joinpointIdentification,这个是因为这个类是为了 供子类切面使用的,所以有一个joinpointIdentification,连接点标识。

protected final class TransactionInfo {
   
		
		private final PlatformTransactionManager transactionManager;

		private final TransactionAttribute transactionAttribute;

		private final String joinpointIdentification;

		private TransactionStatus transactionStatus;

		private TransactionInfo oldTransactionInfo;

初始化和处理流程

然后我们按照我们说明的流程一步步来。
流程:
封装为一个模板,我们只需要传入我们方法,他会自己判断是否有配置事物属性,再通过事物属性判断是所属哪一个事务管理PlatformTransaction

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值