seata 核心类 GlobalTransactionScanner
1.类图
从类图我们可以看出, GlobalTransactionScanner 主要继承了 AbstractAutoProxyCreator 类,实现了 InitializingBean, ApplicationContextAware, DisposableBean接口。
spring 在加载该类的装载顺序
所做的事情:
1.InitializingBean 接口, 重写了afterPropertiesSet 方法
2.DisposableBean 接口,重写了destroy方法
3. ApplicationContextAware 接口 重写了 setApplicationContext 方法,都是spring的基础知识, 不再叙述,
4.重点看一下AbstractAutoProxyCreator 类的 wrapIfNecessary 方法,
这个方法的核心逻辑就是创建我们TM的核心 -- 全局事务方法拦截器GlobalTransactionalInterceptor,关于全局事务方法拦截器,后续会有文章专门描述
2.初始化客户端
这个类实现了 spring 的 InitializingBean 接口,那我们就可以直接去找 afterPropertiesSet 方法了。
我们可以看到,首先会判断一个参数disableGlobalTransaction , 这个参数取值于配置文件中的service.disableGlobalTransaction , 是禁用全局事务的开关, 默认是false, 不禁用。
接下来是 初始化客户端方法 initClient:
主要干了三个事
1.初始化TM(事务管理器,主要负责定义全局事务边界,创建全局事务,回滚/提交全局事务)
- 初始化RM(资源管理区,主要负责管理数据库资源,生成undolog日志)
3.注册优雅停机
关于第三步不再做过多叙述,不是探讨的重点所在, 不再叙述
关于 TM 和RM的初始化,我们单起文档描述 优雅停机和销毁事件,我们单起文档描述