Seata 1.5.2 源码学习( 二 )


7、wrapIfNecessary()只关心DataSource对象,它负责为DataSource对象生成代理对象,并且在SeataAutoDataSourceProxyCreator中维护了DataSource对象与SeataDataSourceProxy对象之间的映射关心
8、创建代理对象时,会给DataSource对象应用AOP拦截器 。用AOP的话来讲,就是给目标对象DataSource织入通知,并创建一个被增强的代理对象
9、通知(拦截器)是SeataAutoDataSourceProxyAdvice,它实现了MethodInterceptor接口
10、SeataAutoDataSourceProxyAdvice#invoke()方法所做的事情就是,拿到原始DataSource的代理对象,并且在代理对象上调用目标方法
综上所述,以上做的所有工作都是为了将来调用 javax.sql.DataSource 上的任意方法时都会被拦截,然后调用其代理对象上对应的方法 。而DataSource中最重要的一个方法就是getConnection()
划重点:将来,所有调用 javax.sql.DataSource#getConnection() 都会被拦截,然后在代理对象上执行getConnection(),因此可以这样说
调 javax.sql.DataSource#getConnection() 实际上执行的是 io.seata.rm.datasource.SeataDataSourceProxy#getConnection()
2. SeataAutoConfiguration
SeataAutoConfiguration里面主要是配置GlobalTransactionScanner(全局事务扫描器)
seata.enabled=true 才会开启 SeataAutoConfiguration

Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

文章插图
GlobalTransactionScanner 也继承自 AbstractAutoProxyCreator,同时还实现了InitializingBean接口 。BeanFactory在设置了所有bean属性之后会调用InitializingBean的afterPropertiesSet()方法
GlobalTransactionScanner#afterPropertiesSet()
Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

文章插图
io.seata.common.DefaultValues中定义了很多默认值
Seata 1.5.2 源码学习

文章插图
同样地,因为实现了BeanPostProcessor接口,所以在启动时BeanFactory实例化Bean之后,会调用GlobalTransactionScanner的postProcessAfterInitialization(),尽管这个postProcessAfterInitialization()方法时从AbstractAutoProxyCreator那里继承来的,但是不影响啊,还是会调用GlobalTransactionScanner这个bean的postProcessAfterInitialization()方法 。于是,最终又会调wrapIfNecessary()方法 。
GlobalTransactionScanner#wrapIfNecessary()
Seata 1.5.2 源码学习

文章插图
这里面有一个很重要的逻辑就是,创建了一个GlobalTransactionalInterceptor对象,并赋值给interceptor
AbstractAutoProxyCreator#getAdvicesAndAdvisorsForBean()是一个抽象方法,实现在子类GlobalTransactionScanner中
Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

文章插图
因此,所有在GlobalTransactionScanner#wrapIfNecessary()中被代理的对象,都被应用GlobalTransactionalInterceptor
GlobalTransactionalInterceptor也是一个MethodInterceptor
也就是说,目标方法的调用都会转到GlobalTransactionalInterceptor#invoke()上
Seata 1.5.2 源码学习

文章插图
GlobalTransactionalInterceptor#handleGlobalTransaction()

经验总结扩展阅读