圖解Spring AOP原理

所有文章已遷移至csdn,csdn個(gè)人主頁(yè)bugpool.blog.csdn.net
本篇旨在讓讀者對(duì)Spring AOP實(shí)現(xiàn)原理有一個(gè)宏觀上的認(rèn)識(shí),因此會(huì)丟失一些細(xì)節(jié)咕幻,具體實(shí)現(xiàn)參考:老實(shí)人Spring源碼目錄
閱讀本篇文章前,希望讀者對(duì)Spring Ioc以及Spring AOP的使用(@Aspect)由一定了解,話不多說(shuō)流椒,直接上圖

準(zhǔn)備工作

  • Service類:有find方法跟save方法,find方法前后需要緩存操作明也,save方法前后需要事務(wù)操作
  • CacheableAspect切面類:用于在Service的find方法前后進(jìn)行緩存操作
  • TransctionlAspect切面類:用于在Service的save方法進(jìn)行事務(wù)操作
  • LogAspect切面類:記錄所有Controller的請(qǐng)求日志
    AOP準(zhǔn)備

Spring AOP自動(dòng)代理時(shí)機(jī)

service bean的創(chuàng)建過(guò)程中(也就是getBean("service"))宣虾,AOP通過(guò)BeanPostProcess后置處理器操作進(jìn)行介入
分為2種情況:

  1. 用戶自定義了targetSource,則bean的創(chuàng)建(實(shí)例化温数、填充安岂、初始化)均由用戶負(fù)責(zé),Spring Ioc不會(huì)在管該代理目標(biāo)對(duì)象traget帆吻,這種情況基本上不會(huì)發(fā)生域那,很多人用了幾年Spring可能都不知道有它的存在
  2. 正常情況下都是Spring Ioc完成代理對(duì)象target的實(shí)例化、填充猜煮、初始化次员。然后在初始化后置處理器中進(jìn)行介入,對(duì)bean也就是service進(jìn)行代理
    Spring AOP代理時(shí)機(jī)

創(chuàng)建代理操作wrapIfNecessary

所有的重點(diǎn)都在wrapIfNecessary做了什么操作

Spring AOP創(chuàng)建代理

代理的方法調(diào)用

創(chuàng)建完代理王带,代理如果調(diào)用方法呢淑蔚?我們以Jdk動(dòng)態(tài)代理為例子,方法的調(diào)用將會(huì)觸發(fā)invoke方法愕撰。具體源碼參考Jdk動(dòng)態(tài)代理 底層源碼

AOP方法執(zhí)行原理

Spring AOP攔截器的執(zhí)行順序

從上面可以看出刹衫,Spring AOP的代理invoke方法,其實(shí)是攔截器的執(zhí)行搞挣。
我們先了解一下Spring AOP的執(zhí)行順序带迟,跟很像,后進(jìn)先出

攔截器的執(zhí)行順序

AOP攔截器執(zhí)行原理

那么這個(gè)攔截器鏈又如何保證beforeafter之前呢囱桨?而且還能保證find方法的執(zhí)行順序仓犬?詳情參考MethodInvocation攔截器調(diào)用原理
這部分實(shí)現(xiàn)原理通過(guò)幾句話是解釋不完的,只能給出圖大家了解個(gè)大概

在這里插入圖片描述

具體攔截器源碼:

public class MethodBeforeAdviceInterceptor implements MethodInterceptor, BeforeAdvice, Serializable {

    private final MethodBeforeAdvice advice;

    @Override
    public Object invoke(MethodInvocation mi) throws Throwable {
        // 先調(diào)用before方法
        this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());
        // 繼續(xù)鏈?zhǔn)秸{(diào)用
        return mi.proceed();
    }

}
public class AfterReturningAdviceInterceptor implements MethodInterceptor, AfterAdvice, Serializable {

   private final AfterReturningAdvice advice;

   @Override
   public Object invoke(MethodInvocation mi) throws Throwable {
      // 先進(jìn)行鏈?zhǔn)秸{(diào)用
      Object retVal = mi.proceed();
      // 再調(diào)用afterReturning方法
      this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), mi.getThis());
      return retVal;
   }

}

壓軸題:Spring AOP遇上循環(huán)依賴

該部分難度系數(shù)十顆星舍肠,算是Spring源碼最復(fù)雜的一塊搀继,這塊弄懂可以說(shuō)對(duì)Spring的理解已經(jīng)達(dá)到阿里水準(zhǔn)了窘面。這里三言兩語(yǔ)是不可能解釋清楚的,只能貼個(gè)圖叽躯,大家有個(gè)宏觀上的認(rèn)知财边,詳情Spring AOP遇上循環(huán)依賴

循環(huán)依賴遇上AOP

總結(jié)

Spring AOP是Spring重要的組成部分之一,本篇只是給讀者宏觀上的一個(gè)認(rèn)識(shí)点骑,具體還是需要閱讀源碼酣难。

畫圖不容易啊,麻煩各位大佬給個(gè)贊畔况!有不懂的問(wèn)題可以留言鲸鹦,會(huì)一一解答,有寫錯(cuò)的地方也歡迎探討跷跪!

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末馋嗜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吵瞻,更是在濱河造成了極大的恐慌葛菇,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橡羞,死亡現(xiàn)場(chǎng)離奇詭異眯停,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)卿泽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門莺债,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人签夭,你說(shuō)我怎么就攤上這事齐邦。” “怎么了第租?”我有些...
    開(kāi)封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵措拇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我慎宾,道長(zhǎng)丐吓,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任趟据,我火速辦了婚禮券犁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘之宿。我一直安慰自己族操,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布比被。 她就那樣靜靜地躺著色难,像睡著了一般。 火紅的嫁衣襯著肌膚如雪等缀。 梳的紋絲不亂的頭發(fā)上枷莉,一...
    開(kāi)封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音尺迂,去河邊找鬼笤妙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛噪裕,可吹牛的內(nèi)容都是我干的蹲盘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼膳音,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼召衔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起祭陷,我...
    開(kāi)封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤苍凛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后兵志,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體醇蝴,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年想罕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悠栓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡按价,死狀恐怖惭适,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俘枫,我是刑警寧澤腥沽,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站鸠蚪,受9級(jí)特大地震影響今阳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茅信,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一盾舌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蘸鲸,春花似錦妖谴、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嗡载。三九已至,卻和暖如春仍稀,著一層夾襖步出監(jiān)牢的瞬間洼滚,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工技潘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遥巴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓享幽,卻偏偏與公主長(zhǎng)得像铲掐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子值桩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容