Spring AOP之原始碼分析

池塘里洗澡的鸭子發表於2024-03-19

  在研究@Enable*註解的應用之:宣告式事務@EnableTransactionManagement詳解原始碼時,配置中context裝置了一個TransactionInterceptor的bean。對這個類比較好奇因為Interceptor,因為MyBatis功能點之二(1):MyBatis提供的攔截器平臺中也分析過interceptor的使用,這個Spring Interceptor是怎樣成體系工作的呢?    

      

  從圖上可以觀察到Advice介面,所以這是Spring AOP實現的增強通知部分。下面從TransactionInterceptor開始倒推邏輯分析Spring AOP的架構:

  1、TransactionInterceptor的載入:

      在@Enable*註解的應用之:宣告式事務@EnableTransactionManagement詳解中有明確結論——ProxyTransactionManagementConfiguration中Java Bean的方式置於context中。

  2、觀察下圖:典型的對應aop配置中的相關內容。

            

    MethodInvocation與MethodInterceptor實現類相互依賴:

      ReflectiveMethodInvocation使用TransactionInterceptor中的invoke方法,ReflectiveMethodInvocation自己作為invoke方法的引數;

      TransactionInterceptor呼叫TransactionAspectSupport中的 invokeWithinTransaction方法,引數是ReflectiveMethodInvocation.getMethod——被代理物件,targetclass——代理物件。

    事務處理邏輯封裝在invokeWithinTransaction方法中。

  3、在Spring核心思想之 AOP:在自定義容器基礎上實現AOP功能實現了功能簡單的aop,瞭解aop的執行在beanpostProcessor中。下面驗證下上述事務功能是不是在某個後置處理中呼叫,確定是哪個後置處理器。

            

  閱讀上圖中程式碼可以知道遍歷對當前bean,遍歷使用processor。透過除錯,可知是InfrastructureAdvisorAutoProxyCreator

            

  其類圖如下:

            

  在其父類AbstractAutoProxyCreator方法wrapIfNecessary中進行實際aop代理的處理:

            

相關文章