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()方法

经验总结扩展阅读