这是我参与更文挑战的第13天,活动详情查看: 更文挑战
首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
一 . 前言
这一篇来看一下 Seate Client 端的配置文件 , 以及配置的方式和流程 , 先来看一下有哪些配置 :
1 | yml复制代码#====================================Seata Config=============================================== |
二 . 配置对象
2.1 Seata 顶级对象
该对象对应的 seata.xxx 配置
1 | java复制代码@ConfigurationProperties(prefix = "seata") |
2.2 seata.client 配置对象
1 | java复制代码 client: |
以上是 client 一级配置对应的类 , 我们来看一下他的子配置
1 | java复制代码// 二级目录 : seata.client.log |
2.3 seata.service 对象
1 | java复制代码@Component |
2.4 seata.transport
我们来看一下配置类和默认参数
1 | java复制代码@Component |
2.5 seata.config
1 | java复制代码@Component |
注意 ,此处有多个实现类 , 每一个都对应一个配置类
2.6 seata.registry
1 | java复制代码@Component |
三 . Client 端的初始化流程
3.1 初始化配置类的流程
来看一下主配置类 SeataAutoConfiguration , 此处会扫描 io.seata.spring.boot.autoconfigure.properties 包下的所有配置类
1 | java复制代码// Client 的配置化主要基于 SeataAutoConfiguration 类来完成 Client 配置操作 |
其中涉及到以下几个对象 :
- C- SpringApplicationContextProvider
- C- FailureHandler
- C- GlobalTransactionScanner
- C- SeataDataSourceBeanPostProcessor
- C- SeataAutoDataSourceProxyCreator
3.1.1 SpringApplicationContextProvider
1 | java复制代码public class SpringApplicationContextProvider implements ApplicationContextAware { |
这里可以看到 , 调用了ObjectHolder存储了 applicationContext
之前分析 Spring 的时候说过 , Aware 可以用于创建后通知 , 此处是往枚举类中设置了一个参数.
第一次看到枚举类这样用的 ,这是不是实现了单例??
1 | java复制代码public enum ObjectHolder { |
3.1.2 FailureHandler
FailureHandler 中提供了 以下方法 :
1 | java复制代码public interface FailureHandler { |
默认实现类为 DefaultFailureHandlerImpl , 这里可配置意味着可以自己实现和扩展
3.1.3 GlobalTransactionScanner
该类中涉及几个抽象和接口 :
- AbstractAutoProxyCreator : 使用AOP代理包装bean的BeanPostProcessor实现
- ConfigurationChangeListener : 配置修改监听
- InitializingBean : 初始化调用
- ApplicationContextAware : Aware 监听处理
- DisposableBean : 销毁处理
C- AbstractAutoProxyCreator # wrapIfNecessary
AbstractAutoProxyCreator 适用于代理 postProcess , 主要运行的是在 postProcessAfterInitialization 阶段调用 :
1 | java复制代码 // 此方法用于校验 |
PS : AdvisedSupport 作用
简单点说 , 就是为这个类做了代理 . 使用AOP代理包装每个合格bean的BeanPostProcessor实现,在调用bean本身之前将委托给指定的拦截器。
ConfigurationChangeListener
1 | java复制代码@Override |
InitializingBean
1 | java复制代码public void afterPropertiesSet() { |
这里看到此处初始化了 TM 及 RM Client 端
1 | java复制代码private void initClient() { |
ApplicationContextAware
此处通过 Aware 完成通知设置 ApplicationContext
1 | java复制代码public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { |
DisposableBean
1 | java复制代码public void destroy() { |
3.1.4 SeataDataSourceBeanPostProcessor
1 | java复制代码public class SeataDataSourceBeanPostProcessor implements BeanPostProcessor { |
SeataAutoDataSourceProxyCreator
1 | java复制代码public class SeataAutoDataSourceProxyCreator extends AbstractAutoProxyCreator { |
总结
其实整篇文章最重要的一个操作就是构建了一个 globalTransactionalInterceptor , 后续主流程中我们会用上这个拦截器
注意 , 每个标注了注解的方法都会通过拦截器进行处理.
本文转载自: 掘金