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
文章插图
文章插图
文章插图
文章插图
GlobalTransactionScanner 也继承自 AbstractAutoProxyCreator,同时还实现了InitializingBean接口 。BeanFactory在设置了所有bean属性之后会调用InitializingBean的afterPropertiesSet()方法
GlobalTransactionScanner#afterPropertiesSet()
文章插图
文章插图
io.seata.common.DefaultValues中定义了很多默认值
文章插图
同样地,因为实现了BeanPostProcessor接口,所以在启动时BeanFactory实例化Bean之后,会调用GlobalTransactionScanner的postProcessAfterInitialization(),尽管这个postProcessAfterInitialization()方法时从AbstractAutoProxyCreator那里继承来的,但是不影响啊,还是会调用GlobalTransactionScanner这个bean的postProcessAfterInitialization()方法 。于是,最终又会调wrapIfNecessary()方法 。
GlobalTransactionScanner#wrapIfNecessary()
文章插图
这里面有一个很重要的逻辑就是,创建了一个GlobalTransactionalInterceptor对象,并赋值给interceptor
AbstractAutoProxyCreator#getAdvicesAndAdvisorsForBean()是一个抽象方法,实现在子类GlobalTransactionScanner中
文章插图
文章插图
文章插图
因此,所有在GlobalTransactionScanner#wrapIfNecessary()中被代理的对象,都被应用GlobalTransactionalInterceptor
GlobalTransactionalInterceptor也是一个MethodInterceptor
也就是说,目标方法的调用都会转到GlobalTransactionalInterceptor#invoke()上
文章插图
GlobalTransactionalInterceptor#handleGlobalTransaction()
经验总结扩展阅读
- .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的生命周期