划重点:将来,所有调用 javax.sql.DataSource#getConnection() 都会被拦截,然后在代理对象上执行getConnection(),因此可以这样说
调 javax.sql.DataSource#getConnection() 实际上执行的是 io.seata.rm.datasource.SeataDataSourceProxy#getConnection()
2. SeataAutoConfiguration
SeataAutoConfiguration里面主要是配置GlobalTransactionScanner(全局事务扫描器)
seata.enabled=true 才会开启 SeataAutoConfiguration

文章插图

文章插图

文章插图

文章插图
GlobalTransactionScanner 也继承自 AbstractAutoProxyCreator , 同时还实现了InitializingBean接口 。BeanFactory在设置了所有bean属性之后会调用InitializingBean的afterPropertiesSet()方法
GlobalTransactionScanner#afterPropertiesSet()

文章插图

文章插图
io.seata.common.DefaultValues中定义了很多默认值

文章插图
同样地,因为实现了BeanPostProcessor接口,所以在启动时BeanFactory实例化Bean之后,会调用GlobalTransactionScanner的postProcessAfterInitialization(),尽管这个postProcessAfterInitialization()方法时从AbstractAutoProxyCreator那里继承来的,但是不影响啊 , 还是会调用GlobalTransactionScanner这个bean的postProcessAfterInitialization()方法 。于是,最终又会调wrapIfNecessary()方法 。
GlobalTransactionScanner#wrapIfNecessary()

文章插图
这里面有一个很重要的逻辑就是,创建了一个GlobalTransactionalInterceptor对象,并赋值给interceptor
AbstractAutoProxyCreator#getAdvicesAndAdvisorsForBean()是一个抽象方法,实现在子类GlobalTransactionScanner中

文章插图

文章插图

文章插图
因此,所有在GlobalTransactionScanner#wrapIfNecessary()中被代理的对象 , 都被应用GlobalTransactionalInterceptor
GlobalTransactionalInterceptor也是一个MethodInterceptor
也就是说 , 目标方法的调用都会转到GlobalTransactionalInterceptor#invoke()上

文章插图
GlobalTransactionalInterceptor#handleGlobalTransaction()

文章插图
事务执行直接调用TransactionalTemplate的execute()方法
io.seata.tm.api.TransactionalTemplate#execute()

文章插图
io.seata.tm.api.GlobalTransactionContext#getCurrent() 获取当前事务

文章插图
io.seata.tm.api.TransactionalTemplate#beginTransaction()

文章插图
tx是DefaultGlobalTransaction
io.seata.tm.api.DefaultGlobalTransaction#begin()
DefaultGlobalTransaction中的TransactionManager是DefaultTransactionManager

文章插图
DefaultTransactionManager中提供了事务相关的底层操作

文章插图
io.seata.tm.api.DefaultGlobalTransaction#commit()

文章插图
io.seata.tm.api.DefaultGlobalTransaction#rollback()的逻辑与commit()类似,都是重试调用transactionManager.rollback(xid)
全局事务扫描器部分的代码就看到这里,下面总结一下:
1、配置项seata.enabled=true 会触发 SeataAutoConfiguration 自动配置
2、SeataAutoConfiguration中创建了一个GlobalTransactionScanner
3、GlobalTransactionScanner继承了AbstractAutoProxyCreator,并实现InitializingBean接口
4、初始化TM、RM
5、由于继承了AbstractAutoProxyCreator,所以BeanFactory会调用GlobalTransactionScanner#方法postProcessAfterInitialization(),最终会调用GlobalTransactionScanner#wrapIfNecessary()来为目标对象创建代理对象
推荐阅读
- .NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>
- Redisson源码解读-公平锁
- OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py
- 【深入浅出 Yarn 架构与实现】1-2 搭建 Hadoop 源码阅读环境
- Redisson源码解读-分布式锁
- 源码级深度理解 Java SPI
- Dubbo-聊聊通信模块设计
- 【lwip】10-ICMP协议&源码分析
- 【lwip】09-IPv4协议&超全源码实现分析
- 从BeanFactory源码看Bean的生命周期