Spring AOP三部曲之調(diào)用

前言
上篇文章我們講解了Spring AOP是如何創(chuàng)建代理對(duì)象的,在這篇文章我們繼續(xù)講解AOP是如何調(diào)用的。

這是從網(wǎng)上找的一個(gè)簡(jiǎn)單demo,大家可以對(duì)照著去理解。
注意:本文是以5.2.3版本為講解。
步驟一:創(chuàng)建代理
在昨天我們講解了通過(guò)createAopProxy()方法里我們根據(jù)不同策略是通過(guò)JDK和CGLIB的代理,在這里我們以JDK創(chuàng)建代理對(duì)象為講解。

步驟二:創(chuàng)建JDK動(dòng)態(tài)代理
大致業(yè)務(wù)如下:
completeProxiedInterfaces:獲取代理類要實(shí)現(xiàn)的接口,包括:SpringProxy類、Advised類、DecoratingProxy類
findDefinedEqualsAndHashCodeMethods:檢查上面得到的接口有沒(méi)有equals方法或hashCode方法
newProxyInstance:創(chuàng)建代理對(duì)象
了解過(guò)動(dòng)態(tài)代理的人應(yīng)該都知道,生成的代理對(duì)象的調(diào)用方法是invoke()方法,所以我們通過(guò)invoke()方法去分析是如何調(diào)用的。

步驟三:處理代理實(shí)例上的方法調(diào)用并返回結(jié)果
InvocationHandler.invoke 的實(shí)現(xiàn)。大致業(yè)務(wù)如下:
equals:被代理對(duì)象未實(shí)現(xiàn)equals方法,使用默認(rèn)equals方法
hashCode:被代理對(duì)象未實(shí)現(xiàn)hashCode方法,使用默認(rèn)hashCode方法
ultimateTargetClass:獲取被代理對(duì)象的最終目標(biāo)類
invokeJoinpointUsingReflectioon:Advised接口或者其父接口中定義的方法,直接反射調(diào)用,不應(yīng)用通知
getInterceptorsAndDynamicInterceptionAdvice:獲取此方法的攔截鏈
如果攔截鏈為空,直接反射調(diào)用JoinPoint
如果攔截鏈非空,創(chuàng)建MethodInvocation(方法調(diào)用),應(yīng)用通知,并執(zhí)行JointPoint


步驟四:獲取此方法的攔截器鏈
通過(guò)該方法我們可以看到,攔截器鏈?zhǔn)菑腁dvisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice()方法獲取到,并放入到緩存中,我們繼續(xù)往下看。

步驟五:獲取config中的advisor列表
大致業(yè)務(wù)如下:
遍歷處理這些advisor
如果是PointAdvisor,則判斷此Advisor能否應(yīng)用到目標(biāo)類方法上
如果是IntorductionAdvisor,則判斷此Advisor能否應(yīng)用到目標(biāo)類targetClass上
將滿足的放入到interceptor集合上

步驟六:觸發(fā)攔截器鏈的執(zhí)行
大致業(yè)務(wù)如下:
如果Interceptor都執(zhí)行完了,則執(zhí)行joinPoint
如果動(dòng)態(tài)匹配運(yùn)行時(shí)參數(shù)滿足匹配條件,執(zhí)行相應(yīng)方法,不滿足略過(guò)當(dāng)前Interceptor,調(diào)用下一個(gè)Interceptor
否則執(zhí)行當(dāng)前Interceptor的目標(biāo)方法

步驟七:反射調(diào)用目標(biāo)方法
如果Interceptor都執(zhí)行完了,則反射調(diào)用當(dāng)前Interceptor的目標(biāo)方法
時(shí)序圖

寫在最后
好兄弟可以點(diǎn)贊并關(guān)注我的公眾號(hào)“javaAnswer”,全部都是干貨。

Spring AOP三部曲之調(diào)用的評(píng)論 (共 條)
