天天看點

Spring | AOP的底層實作原理

AOP是IOC整個過程中的一個擴充點。在after方法中包含對AOP的相關代碼細節:

Spring | AOP的底層實作原理

Jdk和cglib是抛開Spring架構外,自己的建立流程,與Spring架構獨立:

Spring | AOP的底層實作原理

其中相關代碼細節如下所示,以下是add方法的具體細節:

Spring | AOP的底層實作原理
Spring | AOP的底層實作原理

可以看到add方法中涉及var1000及intercept方法:

Spring | AOP的底層實作原理

其中有var1數組:

Spring | AOP的底層實作原理

在CglibAopProxy類中的DynamicAdviseInterceptor方法中,

Spring | AOP的底層實作原理

代碼細節如下:

Spring | AOP的底層實作原理

我們采用TestAop類作為例子,打斷點測試:

Spring | AOP的底層實作原理
Spring | AOP的底層實作原理

可以看到調用資訊:

Spring | AOP的底層實作原理

其中會到intercept方法中,大家測試時經常會走到這個方法裡,但并不清楚是什麼情況,看下面的注釋可以知道,是從advised中擷取配置好的AOP通知:

Spring | AOP的底層實作原理

實際上,繼續往下會到chain中:

Spring | AOP的底層實作原理

通過cglibMethodInvocation來啟動advice通知:

Spring | AOP的底層實作原理

是以,在Bean對象建立過程中,在調用cglib或Jdk方式生成代理對象時,會調用到生成的位元組碼檔案中,找到DynamicAdviseInterceptor類中的interceptor方法,從此方法開始執行,根據之前定義好的通知生成攔截器鍊,從攔截器鍊中一次擷取每一個通知開始執行,在執行過程中,為了友善找到下一個通知是哪個,會有一個CglibMethodInvocation對象,找的時候是從-1的位置依次開始查找并執行。

Spring | AOP的底層實作原理
Spring | AOP的底層實作原理