面試官:談?wù)勀銓?duì)SpringAOP的了解瘦麸?請(qǐng)加上這些內(nèi)容谁撼,絕對(duì)加分!

一滋饲、引言

眾所周知厉碟,一旦提到AOP,相信大家都是條件反射的想到JDK代理和CGLib代理屠缭,沒(méi)錯(cuò)箍鼓,這兩個(gè)代理都是在運(yùn)行時(shí)內(nèi)存中臨時(shí)生成代理類,故而又稱作運(yùn)行時(shí)增強(qiáng)——?jiǎng)討B(tài)代理呵曹。世間萬(wàn)物都不是絕對(duì)的款咖,既然有動(dòng)態(tài)代理何暮,那么,是否有想過(guò):是不是存在靜態(tài)代理呢铐殃?

二海洼、LTW(Load Time Weaving)

其實(shí),除了運(yùn)行時(shí)織入切面的方式外富腊,我們還有一種途徑進(jìn)行切面織入坏逢,它可以在類加載期通過(guò)字節(jié)碼轉(zhuǎn)換,進(jìn)而將目標(biāo)織入切入點(diǎn)(目標(biāo)類)蟹肘,這種方式就是LTW词疼,即靜態(tài)代理(靜待代理也被稱作編譯時(shí)增強(qiáng),后面會(huì)有相關(guān)代碼樣例)帘腹。

LTW在Java5的時(shí)候就被引入了,想要了解其原理许饿,先要了解一個(gè)知識(shí)——Instrument包阳欲。

三、java.lang.instrument包的工作原理

JDK5.0時(shí)引入了此包陋率,目的就是為了能對(duì)JVM底層組建進(jìn)行訪問(wèn)球化。如何訪問(wèn)?其實(shí)說(shuō)來(lái)個(gè)人覺(jué)得還挺麻煩的瓦糟,就是需要通過(guò)JVM的啟動(dòng)參數(shù)-javaagent在啟動(dòng)時(shí)獲取JVM內(nèi)部組件的引用筒愚。參數(shù)格式如下:

-javaagent:<jarpath>[=options]此處先賣個(gè)關(guān)子,不急著解釋參數(shù)中的jarpath和options菩浙,后面的運(yùn)行代碼及結(jié)果的樣例中會(huì)進(jìn)行針對(duì)使用紅框標(biāo)記說(shuō)明巢掺,效果更好。

那么劲蜻,它和AOP有和關(guān)系呢陆淀?

因?yàn)樗贘VM啟動(dòng)時(shí)會(huì)裝配并應(yīng)用ClassTransformer,對(duì)類字節(jié)碼進(jìn)行轉(zhuǎn)換先嬉,進(jìn)而實(shí)現(xiàn)AOP的功能轧苫。

下面說(shuō)一下instrument包下的兩個(gè)重要接口:

ClassFileTransformer

它是Class文件轉(zhuǎn)換器接口,這個(gè)接口有且僅有一個(gè)方法疫蔓,如圖所示:

注意:transform方法會(huì)有一個(gè)返回值含懊,類型是byte[],表示轉(zhuǎn)換后的字節(jié)碼衅胀,但是如果返回為空岔乔,則表示不進(jìn)行節(jié)碼轉(zhuǎn)換處理,千萬(wàn)不要當(dāng)作是把原先類的字節(jié)碼清空拗小。

Instrumentation

這個(gè)接口提供了很多方法重罪,我們主要注意一個(gè)方法即可,即:addTransformer方法,它的作用就是把一些ClassFileTransformer注冊(cè)到JVM內(nèi)部剿配,接口如圖所示:

具體工作原理是這樣的:

① ClassFileTransformer實(shí)例注冊(cè)到JVM之后搅幅,JVM在加載Class文件時(shí),就會(huì)先調(diào)用ClassFileTransformer的transform()方法進(jìn)行字節(jié)碼轉(zhuǎn)換呼胚;

② 若注冊(cè)了多個(gè)ClassFileTransformer實(shí)例茄唐,則按照注冊(cè)時(shí)的順序進(jìn)行一次調(diào)用。

這樣也就實(shí)現(xiàn)了從JVM層面截獲字節(jié)碼蝇更,進(jìn)而織入操作者自己希望添加的邏輯沪编,即實(shí)現(xiàn)AOP效果。

四年扩、代碼及演示效果

說(shuō)了這么多蚁廓,來(lái)點(diǎn)干貨,下面用代碼給大家演示一下如何向JVM中注冊(cè)轉(zhuǎn)換器實(shí)現(xiàn)AOP的厨幻。為了方便大家閱讀相嵌,重要的說(shuō)明筆者已經(jīng)寫(xiě)在代碼的注釋上或者圖片空白處,大家注意查看况脆。

首先饭宾,我們實(shí)現(xiàn)一個(gè)自己的轉(zhuǎn)換器,用于模擬需要切入的功能

注意格了,這里再?gòu)?qiáng)調(diào)下看铆,代碼中的return null;并不是將加載類的字節(jié)碼置空。

其次盛末,我們?cè)賹?shí)現(xiàn)一個(gè)代理類

為什么要實(shí)現(xiàn)代理類內(nèi)弹惦,因?yàn)椴皇莿?dòng)態(tài)代理呀。满败。肤频。

最后,我們寫(xiě)一個(gè)主函數(shù)算墨,代表程序入口

到此為止宵荒,我們的Demo算是完成了,先來(lái)看一下運(yùn)行的結(jié)果:

五净嘀、打jar的時(shí)候需要注意的地方

大家看到執(zhí)行結(jié)果的截圖中报咳,cmd界面下運(yùn)行javaagent參數(shù)時(shí)指定了一個(gè)myTransformer.jar,這個(gè)jar是我們自己需要打出來(lái)的挖藏,可以直接使用eclipse具體步驟如下圖所示暑刃,注意圖中說(shuō)明:

六、總結(jié)

大家可以看到膜眠,其實(shí)使用此類代理并沒(méi)有動(dòng)態(tài)代理方便岩臣,甚至轉(zhuǎn)換器可能會(huì)對(duì)JVM所有類都產(chǎn)生影響溜嗜,操作起來(lái)更新相對(duì)麻煩,實(shí)際生產(chǎn)部署時(shí)會(huì)有很多不便架谎。

但是炸宵,寫(xiě)這些是為了讓大家更好、更多的去了解AOP谷扣,我們所熟知的AOP其實(shí)還有很多東西有待我們自身去學(xué)習(xí)和發(fā)現(xiàn)土全,其實(shí)Spring在"操作麻煩"這方面還是做了不少事的,提供了一些xml的配置化管理(此處就不再說(shuō)了会涎,因?yàn)楦杏X(jué)一說(shuō)又是一大長(zhǎng)篇裹匙,有興趣的大家可以自己去看看,多了解寫(xiě)東西總沒(méi)有壞處)末秃,很多情況下已經(jīng)不需要再配置javaagent參數(shù)了概页。

最后提一句,如果在面試中提到了這些练慕,相信面試官也會(huì)有加分吧绰沥。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贺待,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌零截,老刑警劉巖麸塞,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異涧衙,居然都是意外死亡哪工,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門弧哎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雁比,“玉大人,你說(shuō)我怎么就攤上這事撤嫩≠松樱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵序攘,是天一觀的道長(zhǎng)茴她。 經(jīng)常有香客問(wèn)我,道長(zhǎng)程奠,這世上最難降的妖魔是什么丈牢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮瞄沙,結(jié)果婚禮上己沛,老公的妹妹穿的比我還像新娘慌核。我一直安慰自己,他們只是感情好申尼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布垮卓。 她就那樣靜靜地躺著,像睡著了一般晶姊。 火紅的嫁衣襯著肌膚如雪扒接。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天们衙,我揣著相機(jī)與錄音钾怔,去河邊找鬼。 笑死蒙挑,一個(gè)胖子當(dāng)著我的面吹牛宗侦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忆蚀,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼矾利,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了馋袜?” 一聲冷哼從身側(cè)響起男旗,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎欣鳖,沒(méi)想到半個(gè)月后察皇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泽台,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年什荣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怀酷。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稻爬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜕依,到底是詐尸還是另有隱情桅锄,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布笔横,位于F島的核電站竞滓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吹缔。R本人自食惡果不足惜商佑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厢塘。 院中可真熱鬧茶没,春花似錦肌幽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至笛求,卻和暖如春廊移,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背探入。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工狡孔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜂嗽。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓苗膝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親植旧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辱揭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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