spring @Transational註解註釋的方法或者類的初始化流程

1.入口是AbstractApplicationContext類的refresh方法調用finishBeanFactoryInitialization方法

2.進入finishBeanFactoryInitialization方法的beanFactory.preInstantiateSingletons()方法

3.在preInstantiateSingletons方法裏調用getBean方法

4.執行到抽象類AbstractBeanFactory的getSinglton方法

5.

6.在doCreateBean方法調用initializeBean方法

7.調用init方法的後置處理器

8.調用applyBeanPostProcessorsAfterInitialization方法獲取所有的BeanPostProcessor

9.在AbstractAutoProxyCreator類的postProcessAfterInitialization方法調用wrapIfNecessary方法

10.調用AbstractAutoProxyCreator子類AbstractAdvisorAutoProxyCreator的getAdvicesAndAdvisorsForBean方法

11.一路向下走到了AopUtils的findAdvisorsThatCanApply方法在該方法裏會調用canApply方法

12.一路向下走到接收Pointcut 參數的canApply方法,這裏的Pointcut就是TransactionAttributeSourcePointcut

13.在TransactionAttributeSourcePointcut類的matches方法裏首先獲取TransactionAttributeSource

 

13.這裏其實是在上一個canApply方法時通過BeanFactoryTransactionAttributeSourceAdvisor的getPointcut方法獲取到了他自身的一個TransactionAttributeSourcePointcut內部類然後調用TransactionAttributeSourcePointcut的getTransactionAttributeSource方法獲取transationAttributeSource

14.再回到之前的TransactionAttributeSourcePointcut的matches方法裏,通過判斷如果tas爲空或者目標類的方法裏如果有事務註解就返回true匹配成功,匹配成功後就會對目標類targetClass進行代理

該博客之作爲一個流程記錄,裏面的細節未進行詳細說明,比如transationAttributeSource何時被加載等邏輯將在下一篇博客詳細說明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章