第三十二章 Spring之源码阅读——事务篇

Spring源码阅读目录

第一部分——IOC篇

第一章 Spring之最熟悉的陌生人——IOC
第二章 Spring之假如让你来写IOC容器——加载资源篇
第三章 Spring之假如让你来写IOC容器——解析配置文件篇
第四章 Spring之假如让你来写IOC容器——XML配置文件篇
第五章 Spring之假如让你来写IOC容器——BeanFactory和FactoryBean
第六章 Spring之假如让你来写IOC容器——Scope和属性填充
第七章 Spring之假如让你来写IOC容器——属性填充特别篇:SpEL表达式
第八章 Spring之假如让你来写IOC容器——拓展篇
第九章 Spring之源码阅读——环境搭建篇
第十章 Spring之源码阅读——IOC篇

第二部分——AOP篇

第十一章 Spring之不太熟的熟人——AOP
第十二章 Spring之不得不了解的内容——概念篇
第十三章 Spring之假如让你来写AOP——AOP联盟篇
第十四章 Spring之假如让你来写AOP——雏形篇
第十五章 Spring之假如让你来写AOP——Joinpoint(连接点)篇
第十六章 Spring之假如让你来写AOP——Pointcut(切点)篇
第十七章 Spring之假如让你来写AOP——Advice(通知)上篇
第十八章 Spring之假如让你来写AOP——Advice(通知)下篇
第十九章 Spring之假如让你来写AOP——番外篇:Spring早期设计
第二十章 Spring之假如让你来写AOP——Aspect(切面)篇
第二十一章 Spring之假如让你来写AOP——Weaver(织入器)篇
第二十二章 Spring之假如让你来写AOP——Target Object(目标对象)篇
第二十三章 Spring之假如让你来写AOP——融入IOC容器篇
第二十四章 Spring之源码阅读——AOP篇

第三部分——事务篇

第二十五章 Spring之曾经的老朋友——事务
第二十六章 Spring之假如让你来写事务——初稿篇
第二十七章 Spring之假如让你来写事务——铁三角篇
第二十八章 Spring之假如让你来写事务——属性篇
第二十九章 Spring之假如让你来写事务——状态篇
第三十章 Spring之假如让你来写事务——管理篇
第三十一章 Spring之假如让你来写事务——融入IOC容器篇
第三十二章 Spring之源码阅读——事务篇


文章目录

  • Spring源码阅读目录
    • 第一部分——IOC篇
    • 第二部分——AOP篇
    • 第三部分——事务篇
  • 前言
  • TransactionDefinition(事务属性)
  • TransactionStatus(事务状态)
  • PlatformTransactionManager(事务管理)
  • 总结


前言

    对于Spring一直都是既熟悉又陌生,说对它熟悉吧,平时用用没啥问题,但面试的时候被问的一脸懵逼,就很尴尬,都不好意思在简历上写着熟悉Spring了
在这里插入图片描述

    所以决定花点时间研究研究Spring的源码。主要参考的书籍是:《Spring源码深度解析(第2版)》、《Spring揭秘》、《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》


    现在 A君 又把 事务 集成到了 IOC容器 中,这部分和 AOP 差不多,基本上是以 Spring 的视角开展的。A君 自己发挥的部分并不多。读完前面部分,再去看 Spring 源码,应该没有太大阻碍。A君 在整理这部分的代码时候,磕磕碰碰,不如之前那么通顺了,可以是由于 事务 部分涉及到的东西有点多,诸如:JMSJPAJTA 一堆东西,还有涉及到 分布式事务A君 的精力实在是有限,只能实现最基础的部分了。权当给大伙儿提供个思路了

    这篇文章还是老样子,看下 Spring 的设计上,了解下 事务UML 图上

TransactionDefinition(事务属性)

    其实 事务 主要还是之前提到的那 ‘三剑客’ ,只要把 ‘三剑客’ 理清楚了,整个 事务 基本也就明白个七七八八了。让我们先从最简单的 TransactionDefinition 开始。其 类图 如下:

在这里插入图片描述
正如前面所说,这个类主要是封装 事务属性 的,所以注定他不会太难,只有简单的 get/set 方法。这里唯一前面没提到的,应该就是 DelegatingTransactionDefinition 及其子类,这个其实是一个适配器类,可以将一个已有的事务定义包装起来,以便在不修改原对象的情况下扩展或修改其行为。至于其用途嘛?应该是用来拓展用的是一个适配器类,调整事务传播属性

TransactionStatus(事务状态)

    接着,就是 事务状态 了,和 事务属性 差不多,几乎没什么东西。其 类图 如下:

在这里插入图片描述

能在 Spring 看到这么简单的类图,属实是不容易,不过也侧面说明其非常之简单,只有一条线下去,没有任何分支。虽然设计简单,但它在事务控制的细节处理中非常关键。 事务状态 主要是用于记录事务的当前状态,例如是否新事务、是否完成等

PlatformTransactionManager(事务管理)

    接下来就是 ‘三剑客’ 中的最后一个,也是最麻烦的一个。其 类图 如下:

在这里插入图片描述

看到这蜘蛛网般的类图,大伙儿应该就能明白这玩意不是个易与之辈。也确实是这么回事,PlatformTransactionManager 包揽了 事务 最核心的功能,什么 传播行为回滚提交同步器 都是在这里实现,另外两个只是当当辅助而已。不过虽然麻烦,但是分几点看,就简单了。从大头分,事务 可以分为 编程式声明式。大家别被所谓高大上的名词吓唬到。A君 去了解一下,其实也就那么回事。编程式 即需要写代码实现,每一步都要自己控制。例:

@Test
	public void codeTx() throws Exception {
		ApplicationContext context =
			new ClassPathXmlApplicationContext("jdbc.xml");
		DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
		definition.setTimeout(20);
		definition.setReadOnly(false);
		DruidDataSource dataSource = context.getBean(DruidDataSource.class);

		DataSourceTransactionManager manager = new DataSourceTransactionManager(dataSource);
		TransactionStatus status = manager.getTransaction(definition);
		manager.setRollbackOnCommitFailure(true);

		Connection connection = null;
		PreparedStatement preparedStatement = null;

		try {
			connection =DataSourceUtils.getConnection(dataSource);
			//业务逻辑
			manager.commit(status); // 提交事务
		} catch (Exception e) {
			manager.rollback(status); // 回滚事务
		} 
	}

看到这些代码,其实只有业务逻辑处理部分是不一样的其他地方基本一致,所以 Spring 贴心的给大伙儿准备了模板,即 CallbackPreferringPlatformTransactionManager 这个分支。用模板实现 事务 如下:

	@Test
	public void tempTx(){
		TransactionTemplate ttm = new TransactionTemplate();
		ttm.execute(status -> null);
	}

可以看到,大大简化了代码。只需要关注具体的业务逻辑实现即可,其他的事情不需要操心。当然了,这样子 Spring 还是嫌太麻烦,就有了所谓的 声明式,即不需要写代码,做些简单的配置即可,像 XML注解 都可以归为此类。这类就是 AbstractPlatformTransactionManager 所在的分支

    除此之外,还有个分支,即 ReactiveTransactionManager。这个其实是 响应式事务,用人话说:就是 非阻塞事务。主要是给 Spring WebFlux 这类技术使用的


总结

    现在事务篇终于也宣告结束了,A君Spring 的了解也更上一层楼了,虽然看的时候头昏脑涨的,不过等自己真正做出来时,还是欣喜的

在这里插入图片描述

上一篇:rabbitMq举例


下一篇:每天五分钟深度学习:解析m个样本向量化前向传播的原理