Spring AOP 一:基本概念

一烈炭、Java平臺上AOP實現(xiàn)機制

1、jdk動態(tài)代理:利用攔截器(攔截器必須實現(xiàn)InvocationHanlder) + 反射機制? 生成一個實現(xiàn)代理接口的匿名類宝恶,在調(diào)用具體方法前調(diào)用InvokeHandler來處理符隙。要求目標(biāo)對象實現(xiàn)了接口。

2垫毙、動態(tài)字節(jié)碼增強:利用ASM/CGLIB霹疫,在程序運行期間,對動態(tài)構(gòu)建的字節(jié)碼文件生成相應(yīng)的子類综芥,將橫切邏輯加入自類中丽蝎。不需要目標(biāo)對象實現(xiàn)接口,但擴展類以及方法不能為final膀藐。

????????Spring AOP在無法采用動態(tài)代理機制進行AOP功能擴展的時候屠阻,會使用CGLIB庫的動態(tài)字節(jié)碼增強支持來實現(xiàn)AOP的功能擴展。

????????在Spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>強制使用cglib额各。

3国觉、java代碼生成

4、自定義類加載器

二虾啦、基本概念

1麻诀、JointPoint(連接點/織入點):在系統(tǒng)運行之前,AOP的功能模塊都需要織入到OOP的功能模塊中傲醉。所以蝇闭,要進行這種織入過程, 我們需要知道在系統(tǒng)的哪些執(zhí)行點上進行織入操作,這些將要在其之上進行織入操作的系統(tǒng)執(zhí)行點就 稱之為Joinpoint需频。

圖1

常用的JointPoint類型:

1)方法調(diào)用(Method Call)丁眼。當(dāng)某個方法被調(diào)用的時候所處的程序執(zhí)行點,上圖1中的后面三個“圓 圈”所標(biāo)記的時點都屬于這種類型昭殉。

2)方法調(diào)用執(zhí)行(Method Call execution) 苞七。稱之為方法執(zhí)行或許更簡潔藐守,該Joinpoint類型代表的是某個方法內(nèi)部執(zhí)行開始時點,應(yīng)該與方法調(diào)用類型的Joinpoint進行區(qū)分蹂风。

圖2

方法調(diào)用(method call)是在調(diào)用對象上的執(zhí)行點卢厂,而方法執(zhí)行(method execution)則是在被調(diào)用到的方法邏輯執(zhí)行的時點。對于同一對象惠啄,方法調(diào)用要先于方法執(zhí)行慎恒。

構(gòu)造方法調(diào)用(Constructor Call)。程序執(zhí)行過程中對某個對象調(diào)用其構(gòu)造方法進行初始化的時點撵渡,也就是圖1中如下代碼所在的執(zhí)行點融柬。

HelioBean helloBean = new HelloBean( "Hello! ");

構(gòu)造方法執(zhí)行(Constructor Call Execution)。構(gòu)造方法執(zhí)行和構(gòu)造方法調(diào)用之間的關(guān)系類似于方法執(zhí)行和方法調(diào)用之間的關(guān)系趋距,指的是某個對象構(gòu)造方法內(nèi)部執(zhí)行的開始時點粒氧。

字段設(shè)置(FieldSet)。對象的某個屬性通過setter方法被設(shè)置或者直接被設(shè)置的時點节腐。該Joinpoint 的本質(zhì)是對象的屬性被設(shè)置外盯,而通過setter方法設(shè)置還是直接設(shè)置觸發(fā)的時點是相同的。

字段獲取(FieldGet)翼雀。相對于字段設(shè).置型的Joinpoint,字段獲取型的Joinpoint,對應(yīng)的是某個對象相應(yīng)屬性被訪問的時點饱苟。可以通過getter方法訪問狼渊,當(dāng)然也可以直接訪問箱熬。

異常處理執(zhí)行(Exception Handler Execution該類型的Joinpoin說t應(yīng)程序執(zhí)行過程中,在某些類型異常拋出后囤锉,對應(yīng)的異常處理邏輯執(zhí)行的時點坦弟。

類初始化(Class initialization)?類初始化型的Joinpoint,指的是類中某些靜態(tài)類型或者靜態(tài)塊的初始化時點。比如官地,如下代碼中的log4j初始化位置即屬于該類型Joinpoint對應(yīng)位置的一種酿傍。

class FooBar{

????????static{

????????????//初始化Iog4j?

????????????BasicConfigurator.configure();

? ??????}

????????private Foo attribute;

????????//其他方法定義

}

2驱入、Pointcut(切點):Pointcui概念代表的是Joinpoint的表述方式赤炒。將橫切邏輯織入當(dāng)前系統(tǒng)的過程中,需要參照Pointcut 規(guī)定的Joinpoint信息亏较,才可以知道應(yīng)該往系統(tǒng)的哪些Joinpoint上織入橫切邏輯

????????以圖1中的helloBean.helloMethod()所在位置的Joinpoint為例莺褒,該方法在程序中兩個地方被調(diào)用,而我們系統(tǒng)在這兩個地方都要織入相應(yīng)的橫切邏輯雪情,那么遵岩,我們就可以通過以下Pointcut表述來指定這兩個Joinpoint:系統(tǒng)中HelloBean類的helloMechod()方法被調(diào)用的所有Joinpoint。

????????Pointcut的表述方式:直接指定Joinpoint所在方法名稱、正則表達式尘执、使用特定的Pointcut表述語言舍哄。

3、Advice(通知誊锭、增強處理):按照Advice在Joinpoint位置執(zhí)行時機的差異或者完成功能的不同表悬,Advice可以分成多種具體形式。

1)Before Advice

Before Advice是在Joinpoint指定位置之前執(zhí)行的Advice類型丧靡。通常蟆沫,它不會中斷程序執(zhí)行流程,但如果必要温治,可以通過在Before Advice中拋出異常的方式來中斷當(dāng)前程序流程饭庞。如果當(dāng)前Before Advice 將被織入到方法執(zhí)行類型的Joinpoint,那么這個Before Advice就會先于方法執(zhí)行而執(zhí)行。

????????通常罐盔,可以使用Before Advice做一些系統(tǒng)的初始化工作但绕,比如設(shè)置系統(tǒng)初始值,獲取必要系統(tǒng)資源等惶看。當(dāng)然,并非就限于這些情況六孵。如果要用Before Advice來封裝安全檢查的邏輯纬黎,也不是不可以的,但通常情況下劫窒,我們會使用另一種形式的Advice本今。

2)After Advice

顧名思義,After Advice就是在相應(yīng)連接點之后執(zhí)行的Advice類型主巍,但該類型的Advice還可以細分為以下三種冠息。

? ? ????????After returning Advice,只有當(dāng)前Joinpoint處執(zhí)行流程正常完成后,After returning Advice才會執(zhí)行孕索。比如方法執(zhí)行正常返回而沒有拋出異常逛艰。?

????????????After throwing Advice, 又稱Throws Advice,只有在當(dāng)前Joinpoint執(zhí)行過程中拋出異常的情況下搞旭,才會執(zhí)行散怖。比如某個方法執(zhí)行類型的Joinpoint拋出某異常而沒有正常返回。

????????????After Advice 肄渗,或許叫After (Finally) Advice更為確切镇眷,該類型Advice不管Joinpoint處執(zhí)行流程是正常終了還是拋出異常都會執(zhí)行,就好像Java中的finally塊一樣翎嫡。

如果以方法執(zhí)行類型的Joinpoint為例欠动,我們的各種Advice的執(zhí)行時機可以基本如圖3所示。


圖3

3)Around Advice

AOP Alliance屬下的AOP實現(xiàn)大都采用攔截器(Interceptor)的叫法惑申,但完成的功能是一樣的具伍。Around Advice對附加其上的Joinpoint進行“包裹”,可以在Joinpoint之前和之后都指定相應(yīng)的邏輯翅雏,甚至于中斷或者忽略Joinpoint處原來程序流程的執(zhí)行。

Around Advice的行為可以因為你而發(fā)生改變沿猜。呵呵枚荣,就好像這“居心叵測”的“叵”字,中間的 那一 “口 ”就是Joinpoint,上下一橫就好像是要執(zhí)行的邏輯啼肩。當(dāng)我們只是希望在Joinpoint之前和之后執(zhí)行橫切邏輯橄妆,而忽略原來Joinpoint處的邏輯執(zhí)行的時候,就是居心“叵”測了祈坠。而正常情況下害碾,Around Advice應(yīng)該像一個“巨"字苛让,我們執(zhí)行完Joinpoint之前的邏輯之后炮捧,會接著走Joinpoint,然后才是Joinpoint 之后的邏輯。

既然Around Adviceoj以在Joinpoin之前和之后都能執(zhí)行相應(yīng)的邏輯焰坪,那么躺同,它自然可以完成Before Advice和After Advice的功能阁猜。不過,通常情況下蹋艺,還是應(yīng)該根據(jù)場景選用更為具體的Advice類型剃袍。

Around Advice應(yīng)用場景非常廣泛,我想大家對于J2EE中的Servlet規(guī)范提供的Filter功能應(yīng)該很熟悉吧捎谨。實際上民效,它就是Around Advice的一種體現(xiàn)。使用它涛救,我們就可以完成“資源初始化”畏邢、“安全檢 查”之類橫切系統(tǒng)的關(guān)注點了。

4)Introduction

????????在Aspect!中稱Inter-Type Declaration,在JBoss AOP中稱Mix-in.都指的是這同一種類型的Advice. 與之前的幾種Advice類型不同检吆,Introduction不是根據(jù)橫切邏輯在Joinpoint處的執(zhí)行時機來區(qū)分的舒萎,而是根據(jù)它可以完成的功能而區(qū)別于其他Advice類型。?

????????Introduction可以為原有的對象添加新的特性或者行為咧栗,這就好像你是一個普通公民逆甜,當(dāng)讓你穿軍裝,帶軍帽致板,添加了軍人類型的Introduction之后交煞,你就擁有軍人的特性或者行為。

4斟或、Aspect(切面):Aspect是對系統(tǒng)中的橫切關(guān)注點邏輯進行模塊化封裝的AOP概念實體素征。通常情況下,Aspect可以包含多個Pointcut以及相關(guān)Advice定義。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末御毅,一起剝皮案震驚了整個濱河市根欧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌端蛆,老刑警劉巖凤粗,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異今豆,居然都是意外死亡嫌拣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門呆躲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來异逐,“玉大人,你說我怎么就攤上這事插掂』艺埃” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵辅甥,是天一觀的道長酝润。 經(jīng)常有香客問我,道長璃弄,這世上最難降的妖魔是什么袍祖? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮谢揪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捐凭。我一直安慰自己拨扶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布茁肠。 她就那樣靜靜地躺著患民,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垦梆。 梳的紋絲不亂的頭發(fā)上匹颤,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音托猩,去河邊找鬼印蓖。 笑死,一個胖子當(dāng)著我的面吹牛京腥,可吹牛的內(nèi)容都是我干的赦肃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼他宛!你這毒婦竟也來了船侧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤厅各,失蹤者是張志新(化名)和其女友劉穎镜撩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體队塘,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡袁梗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了人灼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片围段。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖投放,靈堂內(nèi)的尸體忽然破棺而出奈泪,到底是詐尸還是另有隱情,我是刑警寧澤灸芳,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布涝桅,位于F島的核電站,受9級特大地震影響烙样,放射性物質(zhì)發(fā)生泄漏冯遂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一谒获、第九天 我趴在偏房一處隱蔽的房頂上張望蛤肌。 院中可真熱鬧,春花似錦批狱、人聲如沸裸准。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炒俱。三九已至,卻和暖如春爪膊,著一層夾襖步出監(jiān)牢的瞬間权悟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工推盛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留峦阁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓小槐,卻偏偏與公主長得像拇派,于是被迫代替她去往敵國和親荷辕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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

  • 什么是AOP件豌? 與OOP對比疮方,AOP是處理一些橫切行問題。這些橫切性問題不會影響到主邏輯的實現(xiàn)茧彤,但是會散落到代碼的...
    vince_zww閱讀 29,527評論 0 3
  • 基本知識 其實, 接觸了這么久的 AOP, 我感覺, AOP 給人難以理解的一個關(guān)鍵點是它的概念比較多, 而且坑爹...
    永順閱讀 8,209評論 5 114
  • 靜態(tài)AOP與動態(tài)AOP 靜態(tài)AOP將各個Aspect以Java字節(jié)碼的形式編譯到系統(tǒng)的各個功能模塊中,以達到融合A...
    552163671414閱讀 216評論 0 0
  • [TOC] 概述 在軟件開發(fā)中骡显,散布于應(yīng)用中多處的功能被稱為橫切關(guān)注點(cross-cutting concern...
    0x70e8閱讀 611評論 0 0
  • 本博中關(guān)于spring的文章:Spring IOC和AOP原理,Spring事務(wù)原理探究曾掂,Spring配置文件屬性...
    Maggie編程去閱讀 4,104評論 0 34