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君 在整理这部分的代码时候,磕磕碰碰,不如之前那么通顺了,可以是由于 事务 部分涉及到的东西有点多,诸如:JMS、JPA、JTA 一堆东西,还有涉及到 分布式事务,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 的了解也更上一层楼了,虽然看的时候头昏脑涨的,不过等自己真正做出来时,还是欣喜的