part4-knowledge-summary
约 2582 字大约 9 分钟
2026-05-24
系列文章:《深入Spring事务与数据源:从注解到数据库连接的全链路解析》
系列四第4篇:全系列知识点总结与学习建议
基于版本:Spring 5.3.x + Druid 1.2.x + MyBatis 3.5.x
前置阅读:系列一、二、三、四所有文章
前言
经过4个系列共18篇文章的深度剖析,咱们终于走完了从@Transactional注解到数据库连接的完整旅程!
今天这篇文章是系列的收官之作,咱们来做一个系统性的总结,把核心知识点、设计模式、学习建议都梳理一遍。
这篇文章的内容会比较多,但绝对都是精华。建议你收藏起来,以后遇到问题时随时翻阅。
好了,让咱们开始最后的总结之旅!
一、核心概念总结
1.1 Spring事务管理
核心组件:
- @Transactional注解:声明式事务的入口
- TransactionInterceptor:方法拦截器,事务管理的起点
- AbstractPlatformTransactionManager:事务管理器抽象类,模板方法模式
- DataSourceTransactionManager:JDBC事务的具体实现
- TransactionSynchronizationManager:ThreadLocal资源管理
核心流程:
1. @EnableTransactionManagement激活事务管理
2. 为Bean创建代理对象(JDK Proxy / CGLIB)
3. 调用代理方法,进入TransactionInterceptor
4. 解析@Transactional注解,获取事务属性
5. 查找事务管理器
6. 调用tm.getTransaction()创建事务
→ doGetTransaction()检查ThreadLocal
→ doBegin()获取连接,关闭autocommit,绑定ThreadLocal
7. 执行业务方法
8. 成功则commit,失败则rollback
→ doCommit()或doRollback()
9. 清理资源
→ 解绑ThreadLocal,释放连接七种事务传播行为:
- REQUIRED(默认):有事务就加入,没有就创建
- REQUIRES_NEW:不管有没有,都创建新事务
- SUPPORTS:有事务就加入,没有就不创建
- NOT_SUPPORTED:不支持事务,挂起现有事务
- MANDATORY:必须有事务,否则抛异常
- NEVER:不能有事务,否则抛异常
- NESTED:嵌套事务,使用savepoint
1.2 Druid连接池
核心组件:
- DruidDataSource:数据源实现类
- DruidAbstractDataSource:抽象基类
- DruidConnectionHolder:连接持有者
- DruidPooledConnection:代理连接
- Filter链:StatFilter、WallFilter等
核心流程:
1. 初始化连接池,创建初始连接
2. 获取连接时,从池中获取(LIFO)
→ pollLast()从数组末尾获取
→ 如果没有,等待或创建
3. 使用连接,执行SQL
4. 归还连接,放回池中
→ recycle()放入数组末尾
→ notEmpty.signal()唤醒等待线程
5. 后台线程定期检测连接有效性
6. Filter链拦截所有操作,做统计和监控核心配置参数:
- initial-size:初始连接数
- max-active:最大连接数
- min-idle:最小空闲连接数
- max-wait:最大等待时间
- test-while-idle:空闲时检测
- keep-alive:连接保活
1.3 MyBatis执行器
核心组件:
- SqlSessionFactory:SqlSession工厂
- SqlSession:数据库会话
- Executor:SQL执行引擎
- StatementHandler:Statement处理器
- ParameterHandler:参数处理器
- ResultSetHandler:结果集处理器
核心流程:
1. Mapper接口调用(代理对象)
2. MapperProxy.invoke()
3. MapperMethod.execute()
4. SqlSession.selectOne()/insert()/update()/delete()
5. Executor.query()/update()
→ 检查一级缓存
→ 缓存未命中,执行SQL
6. StatementHandler.prepare()
→ 创建PreparedStatement
7. ParameterHandler.setParameters()
→ 设置SQL参数
8. ps.execute()
→ 执行SQL
9. ResultSetHandler.handleResultSets()
→ 处理结果集
10. 返回结果三种Executor:
- SimpleExecutor:简单执行器(默认)
- ReuseExecutor:复用Statement
- BatchExecutor:批量执行
1.4 三大框架协作
关键点:同一个Connection!
事务管理器获取连接 → 绑定到ThreadLocal
↓
MyBatis获取连接 → 从ThreadLocal获取(同一个!)完整执行链路:
1. Spring事务拦截(TransactionInterceptor)
2. 获取数据库连接(DruidDataSource)
3. 开启事务(关闭autocommit)
4. 绑定到ThreadLocal
5. MyBatis执行SQL(从ThreadLocal获取连接)
6. 事务提交(Connection.commit())
7. 释放连接(归还到连接池)二、设计模式总结
2.1 模板方法模式
定义:定义一个算法的骨架,将一些步骤延迟到子类中实现。
应用:
AbstractPlatformTransactionManager:
- 模板方法:
getTransaction()、commit()、rollback() - 抽象方法:
doGetTransaction()、doBegin()、doCommit()、doRollback()
- 模板方法:
BaseExecutor:
- 模板方法:
query()、update() - 抽象方法:
doQuery()、doUpdate()
- 模板方法:
BaseStatementHandler:
- 模板方法:
prepare()、parameterize()、query() - 抽象方法:
instantiateStatement()
- 模板方法:
优点:
- 代码复用,避免重复
- 扩展性好,子类只需实现特定步骤
2.2 代理模式
定义:为其他对象提供一种代理以控制对这个对象的访问。
应用:
Spring事务代理:
- JDK Dynamic Proxy:接口代理
- CGLIB:类代理
- 代理对象拦截方法调用,添加事务逻辑
MyBatis Mapper代理:
- MapperProxy:Mapper接口代理
- 代理对象拦截方法调用,执行SQL
Druid连接代理:
- DruidPooledConnection:Connection代理
- 拦截close()方法,改为归还到连接池
优点:
- 在不修改原对象的情况下添加功能
- 透明性,调用方无感知
2.3 责任链模式
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
应用:
Druid Filter链:
- FilterChainImpl:责任链实现
- StatFilter、WallFilter、LogFilter等
- 每个Filter处理完请求后,调用chain继续执行
MyBatis插件链:
- InterceptorChain:插件链
- 多个插件可以拦截同一个方法
优点:
- 解耦,每个Filter/Plugin职责单一
- 灵活,可以动态添加/移除
2.4 工厂模式
定义:定义一个创建对象的接口,让子类决定实例化哪一个类。
应用:
SqlSessionFactoryBean:
- FactoryBean接口
- 创建复杂的SqlSessionFactory对象
MapperFactoryBean:
- 创建Mapper代理对象
TransactionFactory:
- JdbcTransactionFactory
- SpringManagedTransactionFactory
优点:
- 封装创建逻辑
- 扩展性好
2.5 装饰器模式
定义:动态地给一个对象添加一些额外的职责。
应用:
CachingExecutor:
- 装饰Executor,添加二级缓存功能
- 不修改原有Executor,添加缓存职责
DruidPooledConnection:
- 装饰Connection,添加连接池管理功能
- 拦截close()方法
优点:
- 比继承更灵活
- 可以组合多个装饰器
三、ThreadLocal应用总结
3.1 Spring事务中的ThreadLocal
核心类:TransactionSynchronizationManager
六大ThreadLocal变量:
- resources:当前线程的事务资源映射
- synchronizations:当前线程的事务同步回调列表
- currentTransactionName:当前事务的名称
- currentTransactionReadOnly:当前事务是否只读
- currentTransactionIsolationLevel:当前事务的隔离级别
- actualTransactionActive:当前事务是否活跃
作用:
- 保证同一个线程内的事务能共享同一个连接
- 支持事务传播行为
3.2 ThreadLocal内存泄漏防护
问题:ThreadLocal的生命周期和线程一样长,如果不清理,会导致内存泄漏。
解决方案:
try {
// 使用ThreadLocal
TransactionSynchronizationManager.bindResource(key, value);
} finally {
// 必须清理
TransactionSynchronizationManager.unbindResource(key);
}最佳实践:
- 在finally块中清理
- 使用ThreadLocal.remove()
- 避免在线程池中长期持有
四、学习建议
4.1 如何阅读源码
从入口开始:
- 找到自动配置类或入口方法
- 逐步深入核心逻辑
画流程图:
- 把核心流程画出来
- 帮助理解整体架构
写注释:
- 给关键代码写注释
- 加深理解
做实验:
- 打断点调试
- 观察变量变化
4.2 如何应用源码知识
排查问题:
- 遇到问题时,从源码角度分析根因
- 而不是盲目试错
性能调优:
- 理解源码后,知道哪些参数可以调优
- 知道调优的底层原理
扩展开发:
- 基于源码,开发自定义插件
- 实现特定需求
4.3 推荐学习路径
第一阶段:理解核心概念
- 阅读本系列文章
- 理解核心组件和流程
第二阶段:深入源码
- 下载Spring、Druid、MyBatis源码
- 按照文章中的路径,逐步深入
第三阶段:实践应用
- 在实际项目中应用
- 排查问题、性能调优
第四阶段:扩展开发
- 开发自定义插件
- 贡献开源项目
五、全系列总结
经过4个系列共18篇文章的深度剖析,咱们完整地追踪了从@Transactional注解到数据库连接的全链路:
系列一:Spring事务管理全链路源码解析(5篇)
- 第1篇:@Transactional注解的幕后英雄
- 第2篇:TransactionInterceptor如何开启事务
- 第3篇:AbstractPlatformTransactionManager的事务生命周期
- 第4篇:DataSourceTransactionManager与数据源的绑定
- 第5篇:TransactionSynchronizationManager资源管理揭秘
系列二:数据源与连接池全链路源码解析(5篇)
- 第1篇:DataSource接口规范与SPI机制
- 第2篇:Druid连接池架构与核心流程
- 第3篇:连接获取与回收的完整链路
- 第4篇:Druid Filter链机制
- 第5篇:连接有效性检测与性能调优
系列三:MyBatis执行器全链路源码解析(4篇)
- 第1篇:MyBatis自动装配与SqlSessionFactory创建
- 第2篇:SqlSession与Executor执行器的创建
- 第3篇:SimpleExecutor与SQL执行
- 第4篇:MyBatis全链路总结
系列四:整合与调优全链路源码解析(4篇)
- 第1篇:三大框架协作全链路分析
- 第2篇:常见异常分析与根因定位
- 第3篇:性能调优最佳实践
- 第4篇:全链路知识点总结(本篇)
六、最后的寄语
感谢你坚持读完了这个系列的所有文章!
我知道,源码分析是一件枯燥的事情,需要极大的耐心和毅力。但是,当你真正搞懂了源码的底层逻辑,你会发现一切都值得。
记住,阅读源码不是为了装逼,而是为了更好地解决问题。当你在工作中遇到问题时,能够从源码角度分析根因,而不是盲目地试错,这就是阅读源码的最大价值。
希望这个系列能够帮助你:
- 理解Spring事务、Druid连接池、MyBatis执行器的底层原理
- 掌握源码阅读的方法和技巧
- 建立系统化的性能调优思路
- 提高排查问题的能力
如果你在阅读过程中有任何疑问或建议,欢迎留言交流。
祝你在技术之路上越走越远!
参考资料
- Spring Framework 5.3.x 源码
- Druid 1.2.x 源码
- MyBatis 3.5.x 源码
- 《Spring源码深度解析》
- 《MyBatis技术内幕》
- 《阿里巴巴Druid官方文档》
- 《Java并发编程实战》
- 《设计模式》
- 实际项目经验总结