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何時被加載等邏輯將在下一篇博客詳細說明