国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

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

2022-05-24 11:43 作者:做架構(gòu)師不做框架師  | 我要投稿


前言

上篇文章我們講解了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)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
志丹县| 甘南县| 抚顺县| 互助| 苍南县| 图们市| 普兰店市| 略阳县| 汉沽区| 瓮安县| 将乐县| 英吉沙县| 揭阳市| 巴林右旗| 彭泽县| 盐池县| 夏津县| 屏东市| 佳木斯市| 富源县| 叶城县| 大港区| 托里县| 蒙阴县| 定结县| 讷河市| 乾安县| 乌兰察布市| 大新县| 手游| 高青县| 筠连县| 博客| 青田县| 遂溪县| 商洛市| 昌邑市| 张家界市| 正宁县| 襄垣县| 扬州市|