文章有点长,我决定用半个小时来给您分享~
文章插图
基于Seata 1.5.2 , 项目中用 seata-spring-boot-starter
1. SeataDataSourceAutoConfiguration
文章插图
SeataDataSourceAutoConfiguration 主要是配置数据源代理,可以看到:
- 默认seata.enabled、seata.enableAutoDataSourceProxy、seata.enable-auto-data-source-proxy都是true
- 只有当classpath中有DataSource时才会进行此配置
- 创建了一个SeataAutoDataSourceProxyCreator,用于自动代理数据源
文章插图
先记一下 , SeataAutoDataSourceProxyCreator是一个BeanPostProcessor
刚才new了一个SeataAutoDataSourceProxyCreator,继续看构造方法,默认useJdkProxy是false,excludes为空,dataSourceProxyMode是AT
文章插图
构造方法中最重要的一件事情是构造AOP通知(拦截器),这里new了一个SeataAutoDataSourceProxyAdvice
文章插图
SeataAutoDataSourceProxyAdvice是一个MethodInterceptor 。
MethodInterceptor是aop中的一个接口,当目标方法被调用时就会调用与之关联的MethodInterceptor的invoke方法
文章插图
至此,在构造方法中完成了advisors的赋值,advisors[]中有一个DefaultIntroductionAdvisor , DefaultIntroductionAdvisor中引用了SeataAutoDataSourceProxyAdvice
前面说过,SeataAutoDataSourceProxyCreator是一个BeanPostProcessor,而BeanPostProcessor是BeanFactory中的一个钩子(回调) , 称之为后置处理器
文章插图
AbstractAutoProxyCreator#postProcessBeforeInstantiation()
文章插图
AbstractAutoProxyCreator#postProcessAfterInitialization()
文章插图
AbstractAutoProxyCreator#wrapIfNecessary()
文章插图
AbstractAutoProxyCreator#getAdvicesAndAdvisorsForBean()
文章插图
SeataAutoDataSourceProxyCreator#getAdvicesAndAdvisorsForBean()
文章插图
SeataAutoDataSourceProxyCreator#wrapIfNecessary()
文章插图
DataSourceProxyHolder维护了数据源对象与数据源代理对象的映射
文章插图
至此,数据源代理部分就看完了,下面总结一下:
1、启动的时候自动配置数据源代理,创建了一个SeataAutoDataSourceProxyCreator
2、SeataAutoDataSourceProxyCreator在构造方法中创建AOP通知,并赋值给其属性
3、AbstractAutoProxyCreator是一个抽象类不能被实例化,能实例化的只有SeataAutoDataSourceProxyCreator
4、SeataAutoDataSourceProxyCreator从AbstractAutoProxyCreator那里继承了很多属性和方法,其中就包括postProcessBeforeInstantiation()、postProcessAfterInitialization()、createProxy()等等
5、SeataAutoDataSourceProxyCreator间接实现了BeanPostProcessor接口,也就是说它也是BeanPostProcessor的一个实现类
6、BeanFactory回调所有的BeanPostProcessor#postProcessAfterInitialization()时,就会调用SeataAutoDataSourceProxyCreator的postProcessAfterInitialization()方法,最终会调用wrapIfNecessary()方法
7、wrapIfNecessary()只关心DataSource对象 , 它负责为DataSource对象生成代理对象 , 并且在SeataAutoDataSourceProxyCreator中维护了DataSource对象与SeataDataSourceProxy对象之间的映射关心
8、创建代理对象时,会给DataSource对象应用AOP拦截器 。用AOP的话来讲,就是给目标对象DataSource织入通知,并创建一个被增强的代理对象
9、通知(拦截器)是SeataAutoDataSourceProxyAdvice,它实现了MethodInterceptor接口
10、SeataAutoDataSourceProxyAdvice#invoke()方法所做的事情就是,拿到原始DataSource的代理对象,并且在代理对象上调用目标方法
综上所述,以上做的所有工作都是为了将来调用 javax.sql.DataSource 上的任意方法时都会被拦截,然后调用其代理对象上对应的方法 。而DataSource中最重要的一个方法就是getConnection()
推荐阅读
- .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的生命周期