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

推薦閱讀