Seata 1.5.2 源码学习

文章有点长,我决定用半个小时来给您分享~

Seata 1.5.2 源码学习

文章插图
基于Seata 1.5.2 , 项目中用 seata-spring-boot-starter
1. SeataDataSourceAutoConfiguration
Seata 1.5.2 源码学习

文章插图
SeataDataSourceAutoConfiguration 主要是配置数据源代理,可以看到:
  1. 默认seata.enabled、seata.enableAutoDataSourceProxy、seata.enable-auto-data-source-proxy都是true
  2. 只有当classpath中有DataSource时才会进行此配置
  3. 创建了一个SeataAutoDataSourceProxyCreator,用于自动代理数据源

Seata 1.5.2 源码学习

文章插图
先记一下 , SeataAutoDataSourceProxyCreator是一个BeanPostProcessor
刚才new了一个SeataAutoDataSourceProxyCreator,继续看构造方法,默认useJdkProxy是false,excludes为空,dataSourceProxyMode是AT
Seata 1.5.2 源码学习

文章插图
构造方法中最重要的一件事情是构造AOP通知(拦截器),这里new了一个SeataAutoDataSourceProxyAdvice
Seata 1.5.2 源码学习

文章插图
SeataAutoDataSourceProxyAdvice是一个MethodInterceptor 。
MethodInterceptor是aop中的一个接口,当目标方法被调用时就会调用与之关联的MethodInterceptor的invoke方法
Seata 1.5.2 源码学习

文章插图
至此,在构造方法中完成了advisors的赋值,advisors[]中有一个DefaultIntroductionAdvisor , DefaultIntroductionAdvisor中引用了SeataAutoDataSourceProxyAdvice
前面说过,SeataAutoDataSourceProxyCreator是一个BeanPostProcessor,而BeanPostProcessor是BeanFactory中的一个钩子(回调) , 称之为后置处理器
Seata 1.5.2 源码学习

文章插图
AbstractAutoProxyCreator#postProcessBeforeInstantiation()
Seata 1.5.2 源码学习

文章插图
AbstractAutoProxyCreator#postProcessAfterInitialization()
Seata 1.5.2 源码学习

文章插图
AbstractAutoProxyCreator#wrapIfNecessary()
Seata 1.5.2 源码学习

文章插图
AbstractAutoProxyCreator#getAdvicesAndAdvisorsForBean()
Seata 1.5.2 源码学习

文章插图
SeataAutoDataSourceProxyCreator#getAdvicesAndAdvisorsForBean()
Seata 1.5.2 源码学习

文章插图
SeataAutoDataSourceProxyCreator#wrapIfNecessary()
Seata 1.5.2 源码学习

文章插图
DataSourceProxyHolder维护了数据源对象与数据源代理对象的映射
Seata 1.5.2 源码学习

文章插图
至此,数据源代理部分就看完了,下面总结一下:
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()

推荐阅读