Spring AOP學(xué)習(xí)筆記

AOP設(shè)計(jì)基本原理

什么是AOP(即面向切面編程)欲账?

通常面向?qū)ο蟮某绦颍a都是按照時(shí)間序列縱向展開的,而他們都有一個(gè)共性:即都是以方法調(diào)用作為基本執(zhí)行單位展開的瀑焦。將方法調(diào)用當(dāng)做一個(gè)連接點(diǎn)荆针,那么由連接點(diǎn)串起來的程序執(zhí)行流就是整個(gè)程序的執(zhí)行過程敞嗡。

AOP則是從另外一個(gè)角度來考慮整個(gè)程序的,AOP將每一個(gè)方法調(diào)用航背,即連接點(diǎn)作為編程的入口喉悴,針對(duì)方法調(diào)用進(jìn)行編程。從執(zhí)行的邏輯上來看玖媚,相當(dāng)于在之前縱向的按照時(shí)間軸執(zhí)行的程序橫向切入箕肃。相當(dāng)于將之前的程序橫向切割成若干的面,即Aspect每個(gè)面被稱為切面今魔。

所以勺像,根據(jù)我的理解,AOP本質(zhì)上是針對(duì)方法調(diào)用的編程思路错森。

既然AOP是針對(duì)切面進(jìn)行的編程的吟宦,那么,你需要選擇哪些切面(即 連接點(diǎn)Joint Point)作為你的編程對(duì)象呢涩维?

因?yàn)榍忻姹举|(zhì)上是每一個(gè)方法調(diào)用督函,選擇切面的過程實(shí)際上就是選擇方法的過程。那么激挪,被選擇的切面(Aspect)在AOP術(shù)語里被稱為切入點(diǎn)(Point Cut).? 切入點(diǎn)實(shí)際上也是從所有的連接點(diǎn)(Join point)挑選自己感興趣的連接點(diǎn)的過程辰狡。

代理模式的引入:

加入了代理模式的Java程序執(zhí)行流,使得所有的方法調(diào)用都經(jīng)過了代理對(duì)象垄分。對(duì)于Spring AOP框架而言宛篇,它負(fù)責(zé)控制著真?zhèn)€容器內(nèi)部的代理對(duì)象。當(dāng)我們調(diào)用了某一個(gè)實(shí)例對(duì)象的任何一個(gè)非final的public方法時(shí)薄湿,整個(gè)Spring框架都會(huì)知曉叫倍。

此時(shí)的SpringAOP框架在某種程度上扮演著一個(gè)上帝的角色:它知道你在這個(gè)框架內(nèi)所做的任何操作,你對(duì)每一個(gè)實(shí)例對(duì)象的非final的public方法調(diào)用都可以被框架察覺到豺瘤!

既然Spring代理層可以察覺到你所做的每一次對(duì)實(shí)例對(duì)象的方法調(diào)用吆倦,那么,Spring就有機(jī)會(huì)在這個(gè)代理的過程中插入Spring的自己的業(yè)務(wù)代碼坐求。

Spring AOP的工作原理

為了降低我們對(duì)Spring的AOP的理解難度蚕泽,我在這里將代理角色的職能進(jìn)行了簡化,方便大家理解。(注意:真實(shí)的Spring AOP的proxy角色扮演的只能比這復(fù)雜的多须妻,這里只是簡化仔蝌,方便大家理解,請(qǐng)不要先入為主)代理模式的代理角色最起碼要考慮三個(gè)階段:

1.在調(diào)用真正對(duì)象的方法之前荒吏,應(yīng)該需要做什么敛惊?

2.在調(diào)用真正對(duì)象的方法過程中,如果拋出了異常绰更,需要做什么瞧挤?

3.在調(diào)用真正對(duì)象的方法后,返回了結(jié)果了儡湾,需要做什么皿伺?

AOP對(duì)這個(gè)方法調(diào)用的編程,就是針對(duì)這三個(gè)階段插入自己的業(yè)務(wù)代碼盒粮。

現(xiàn)在我們假設(shè)當(dāng)前RealSubject這個(gè)角色的類是org.luanlouis.springlearning.aop.FooService,當(dāng)前這個(gè)連接點(diǎn)對(duì)應(yīng)的方法簽名是:public void foo()奠滑。那么上述的代理對(duì)象的三個(gè)階段將會(huì)有以下的處理邏輯:

1.在調(diào)用真正對(duì)象的方法之前丹皱,

proxy會(huì)告訴Spring AOP:? "我將要調(diào)用類org.luanlouis.springlearning.aop.FooServicepublic void foo(),在調(diào)用之前宋税,你有什么處理建議嗎摊崭?";

Spring AOP這時(shí)根據(jù)proxy提供的類名和方法簽名,然后拿這些信息嘗試匹配是否在其感興趣的切入點(diǎn)內(nèi),如果在感興趣的切入點(diǎn)內(nèi)杰赛,Spring AOP會(huì)返回MethodBeforeAdvice處理建議呢簸,告訴proxy應(yīng)該執(zhí)行的操作;

2.在調(diào)用真正對(duì)象的方法過程中乏屯,如果拋出了異常根时,需要做什么?

proxy告訴Spring AOP: “我調(diào)用類org.luanlouis.springlearning.aop.FooServicepublic void foo()過程中拋出了異常辰晕,你有什么處理建議蛤迎?”

Spring AOP根據(jù)proxy提供的類型和方法簽名,確定了在其感興趣的切入點(diǎn)內(nèi)含友,則返回相應(yīng)的處理建議ThrowsAdvice替裆,告訴proxy這個(gè)時(shí)期應(yīng)該采取的操作。

3.在調(diào)用真正對(duì)象的方法后窘问,返回了結(jié)果了辆童,需要做什么?

proxy告訴Spring AOP:"我調(diào)用類org.luanlouis.springlearning.aop.FooServicepublic void foo()結(jié)束了惠赫,并返回了結(jié)果你現(xiàn)在有什么處理建議把鉴?";

Spring AOP根據(jù)proxy提供的類型名和方法簽名儿咱,確定了在其感興趣的切入點(diǎn)內(nèi)纸镊,則返回AfterReturingAdivce處理建議倍阐,proxy得到這個(gè)處理建議,然后執(zhí)行建議逗威;


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末峰搪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凯旭,更是在濱河造成了極大的恐慌概耻,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罐呼,死亡現(xiàn)場離奇詭異鞠柄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嫉柴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門厌杜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人计螺,你說我怎么就攤上這事夯尽。” “怎么了登馒?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵匙握,是天一觀的道長。 經(jīng)常有香客問我陈轿,道長圈纺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任麦射,我火速辦了婚禮蛾娶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘潜秋。我一直安慰自己茫叭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布半等。 她就那樣靜靜地躺著揍愁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杀饵。 梳的紋絲不亂的頭發(fā)上莽囤,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音切距,去河邊找鬼朽缎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的话肖。 我是一名探鬼主播北秽,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼最筒!你這毒婦竟也來了贺氓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤床蜘,失蹤者是張志新(化名)和其女友劉穎辙培,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邢锯,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扬蕊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丹擎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尾抑。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蒂培,靈堂內(nèi)的尸體忽然破棺而出再愈,到底是詐尸還是另有隱情,我是刑警寧澤毁渗,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站单刁,受9級(jí)特大地震影響灸异,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜羔飞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一肺樟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逻淌,春花似錦么伯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至骨望,卻和暖如春硬爆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擎鸠。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工缀磕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓袜蚕,卻偏偏與公主長得像糟把,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牲剃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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