AOP基礎(chǔ)

一.AOP能干什么

AOP主要用于橫切關(guān)注點分離和織入仅偎,因此需要理解橫切關(guān)注點和織入:

  • <b>關(guān)注點:</b>可以認(rèn)為是所關(guān)注的任何東西跨蟹,
  • <b>關(guān)注點分離:</b>將問題細(xì)化從而單獨部分,即可以理解為不可再分割的組件哨颂;
  • <b>橫切關(guān)注點:</b>一個組件無法完成需要的功能喷市,需要其他組件協(xié)作完成怖亭,如日志組件橫切于支付組件患亿;
  • <b>織入:</b>橫切關(guān)注點分離后擅编,需要通過某種技術(shù)將橫切關(guān)注點融合到系統(tǒng)中從而完成需要的功能蜕猫,因此需要織入,織入可能在編譯期腹备、加載期衬潦、運(yùn)行期等進(jìn)行。
    橫切關(guān)注點可能包含很多植酥,比如非業(yè)務(wù)的:日志镀岛、事務(wù)處理、緩存友驮、性能統(tǒng)計漂羊、權(quán)限控制等等這些非業(yè)務(wù)的基礎(chǔ)功能;還可能是業(yè)務(wù)的:如某個業(yè)務(wù)組件橫切于多個模塊
二.AOP的基本概念

在進(jìn)行AOP開發(fā)前卸留,先熟悉幾個概念:

  • <b>連接點(Jointpoint):</b>表示需要在程序中插入橫切關(guān)注點的擴(kuò)展點走越,連接點可能是類初始化、方法執(zhí)行耻瑟、方法調(diào)用旨指、字段調(diào)用或處理異常等等,Spring只支持方法執(zhí)行連接點喳整,在AOP中表示為“在哪里干谆构;
  • <b>切入點(Pointcut):</b>選擇一組相關(guān)連接點的模式,即可以認(rèn)為連接點的集合框都,Spring支持perl5正則表達(dá)式和AspectJ切入點模式搬素,Spring默認(rèn)使用AspectJ語法,在AOP中表示為“在哪里干的集合瞬项;
  • <b>通知(Advice):</b>在連接點上執(zhí)行的行為蔗蹋,通知提供了在AOP中需要在切入點所選擇的連接點處進(jìn)行擴(kuò)展現(xiàn)有行為的手段何荚;包括前置通知(before advice)囱淋、后置通知(after advice)、環(huán)繞通知(around advice)餐塘,在Spring中通過代理模式實現(xiàn)AOP妥衣,并通過攔截器模式以環(huán)繞連接點的攔截器鏈織入通知;在AOP中表示為“干什么
  • <b>方面/切面(Aspect):</b>橫切關(guān)注點的模塊化戒傻,比如上邊提到的日志組件税手。可以認(rèn)為是通知需纳、引入和切入點的組合芦倒;在Spring中可以使用Schema和@AspectJ方式進(jìn)行組織實現(xiàn);在AOP中表示為“在哪干和干什么集合”不翩;**
  • <b>引入(inter-type declaration*):</b>也稱為內(nèi)部類型聲明兵扬,為已有的類添加額外新的字段或方法麻裳,Spring允許引入新的接口(必須對應(yīng)一個實現(xiàn))到所有被代理對象(目標(biāo)對象),在AOP中表示為“干什么(引入什么);
  • <b>目標(biāo)對象(Target Object):</b>需要被織入橫切關(guān)注點的對象器钟,即該對象是切入點選擇的對象津坑,需要被通知的對象,從而也可稱為“被通知對象”傲霸;由于Spring AOP 通過代理模式實現(xiàn)疆瑰,從而這個對象永遠(yuǎn)是被代理對象,在AOP中表示為“對誰干昙啄;
  • <b>AOP代理(AOP Proxy):</b>AOP框架使用代理模式創(chuàng)建的對象穆役,從而實現(xiàn)在連接點處插入通知(即應(yīng)用切面),就是通過代理來對目標(biāo)對象應(yīng)用切面梳凛。在Spring中孵睬,AOP代理可以用JDK動態(tài)代理或CGLIB代理實現(xiàn),而通過攔截器模型應(yīng)用切面伶跷。
  • <b>織入(Weaving):</b>織入是一個過程掰读,是將切面應(yīng)用到目標(biāo)對象從而創(chuàng)建出AOP代理對象的過程,織入可以在編譯期叭莫、類裝載期蹈集、運(yùn)行期進(jìn)行。
三.AOP 通知類型
  • <b>前置通知(Before Advice):</b>在切入點選擇的連接點處的方法之前執(zhí)行的通知雇初,該通知不影響正常程序執(zhí)行流程(除非該通知拋出異常拢肆,該異常將中斷當(dāng)前方法鏈的執(zhí)行而返回)。

  • <b>后置通知(After Advice):</b>在切入點選擇的連接點處的方法之后執(zhí)行的通知靖诗,包括如下類型的后置通知:后置返回通知(After returning Advice):在切入點選擇的連接點處的方法正常執(zhí)行完畢時執(zhí)行的通知郭怪,必須是連接點處的方法沒拋出任何異常正常返回時才調(diào)用后置通知。

  • <b>后置異常通知(After throwing Advice):</b>在切入點選擇的連接點處的方法拋出異常返回時執(zhí)行的通知刊橘,必須是連接點處的方法拋出任何異常返回時才調(diào)用異常通知鄙才。

  • <b>后置最終通知(After finally Advice): </b>在切入點選擇的連接點處的方法返回時執(zhí)行的通知,不管拋沒拋出異常都執(zhí)行促绵,類似于Java中的finally塊攒庵。

  • <b>環(huán)繞通知(Around Advices):</b>環(huán)繞著在切入點選擇的連接點處的方法所執(zhí)行的通知,環(huán)繞通知可以在方法調(diào)用之前和之后自定義任何行為败晴,并且可以決定是否執(zhí)行連接點處的方法浓冒、替換返回值、拋出異常等等尖坤。

三.AOP代理

AOP代理就是AOP框架通過代理模式創(chuàng)建的對象稳懒,Spring使用JDK動態(tài)代理或CGLIB代理來實現(xiàn),Spring缺省使用JDK動態(tài)代理來實現(xiàn)慢味,從而任何接口都可別代理场梆,如果被代理的對象實現(xiàn)不是接口將默認(rèn)使用CGLIB代理佛致,不過CGLIB代理當(dāng)然也可應(yīng)用到接口。
<b>AOP代理的目的就是將切面織入到目標(biāo)對象</b>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辙谜,一起剝皮案震驚了整個濱河市俺榆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌装哆,老刑警劉巖罐脊,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜕琴,居然都是意外死亡萍桌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門凌简,熙熙樓的掌柜王于貴愁眉苦臉地迎上來上炎,“玉大人,你說我怎么就攤上這事雏搂∨菏” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵凸郑,是天一觀的道長裳食。 經(jīng)常有香客問我,道長芙沥,這世上最難降的妖魔是什么诲祸? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮而昨,結(jié)果婚禮上救氯,老公的妹妹穿的比我還像新娘。我一直安慰自己歌憨,他們只是感情好着憨,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著躺孝,像睡著了一般享扔。 火紅的嫁衣襯著肌膚如雪底桂。 梳的紋絲不亂的頭發(fā)上植袍,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機(jī)與錄音籽懦,去河邊找鬼于个。 笑死,一個胖子當(dāng)著我的面吹牛暮顺,可吹牛的內(nèi)容都是我干的厅篓。 我是一名探鬼主播秀存,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼羽氮!你這毒婦竟也來了或链?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤档押,失蹤者是張志新(化名)和其女友劉穎澳盐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體令宿,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡叼耙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粒没。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筛婉。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖癞松,靈堂內(nèi)的尸體忽然破棺而出爽撒,到底是詐尸還是另有隱情,我是刑警寧澤响蓉,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布匆浙,位于F島的核電站,受9級特大地震影響厕妖,放射性物質(zhì)發(fā)生泄漏首尼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一言秸、第九天 我趴在偏房一處隱蔽的房頂上張望软能。 院中可真熱鬧,春花似錦举畸、人聲如沸查排。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跋核。三九已至,卻和暖如春叛买,著一層夾襖步出監(jiān)牢的瞬間砂代,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工率挣, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留刻伊,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像捶箱,于是被迫代替她去往敵國和親智什。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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