什么是spring Aop

什么是spring Aop

AOP(Aspect-OrientedProgramming,面向切面編程)炎疆,可以說(shuō)是OOP(Object-Oriented Programing启泣,面向?qū)ο缶幊蹋┑难a(bǔ)充和完善面褐。OOP引入封裝椿浓、繼承和多態(tài)性等概念來(lái)建立一種對(duì)象層次結(jié)構(gòu)纬黎,用以模擬公共行為的一個(gè)集合幅骄。當(dāng)我們需要為分散的對(duì)象引入公共行為的時(shí)候,OOP則顯得無(wú)能為力本今。也就是說(shuō)拆座,OOP允許你定義從上到下的關(guān)系,但并不適合定義從左到右的關(guān)系冠息。例如日志功能挪凑。日志代碼往往水平地散布在所有對(duì)象層次中,而與它所散布到的對(duì)象的核心功能毫無(wú)關(guān)系逛艰。對(duì)于其他類型的代碼躏碳,如安全性、異常處理和透明的持續(xù)性也是如此散怖。這種散布在各處的無(wú)關(guān)的代碼被稱為橫切(cross-cutting)代碼菇绵,在OOP設(shè)計(jì)中肄渗,它導(dǎo)致了大量代碼的重復(fù),而不利于各個(gè)模塊的重用咬最。

而AOP技術(shù)則恰恰相反翎嫡,它利用一種稱為“橫切”的技術(shù),剖解開(kāi)封裝的對(duì)象內(nèi)部永乌,并將那些影響了多個(gè)類的公共行為封裝到一個(gè)可重用模塊惑申,并將其名為“Aspect”,即方面铆遭。所謂“方面”硝桩,簡(jiǎn)單地說(shuō),就是將那些與業(yè)務(wù)無(wú)關(guān)枚荣,卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來(lái)碗脊,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度橄妆,并有利于未來(lái)的可操作性和可維護(hù)性衙伶。AOP代表的是一個(gè)橫向的關(guān)系,如果說(shuō)“對(duì)象”是一個(gè)空心的圓柱體害碾,其中封裝的是對(duì)象的屬性和行為矢劲;那么面向方面編程的方法,就仿佛一把利刃慌随,將這些空心圓柱體剖開(kāi)芬沉,以獲得其內(nèi)部的消息。而剖開(kāi)的切面阁猜,也就是所謂的“方面”了丸逸。然后它又以巧奪天功的妙手將這些剖開(kāi)的切面復(fù)原,不留痕跡剃袍。

使用“橫切”技術(shù)黄刚,AOP把軟件系統(tǒng)分為兩個(gè)部分:核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)。業(yè)務(wù)處理的主要流程是核心關(guān)注點(diǎn)民效,與之關(guān)系不大的部分是橫切關(guān)注點(diǎn)憔维。橫切關(guān)注點(diǎn)的一個(gè)特點(diǎn)是,他們經(jīng)常發(fā)生在核心關(guān)注點(diǎn)的多處畏邢,而各處都基本相似业扒。比如權(quán)限認(rèn)證、日志棵红、事務(wù)處理凶赁。Aop 的作用在于分離系統(tǒng)中的各種關(guān)注點(diǎn),將核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)分離開(kāi)來(lái)。正如Avanade公司的高級(jí)方案構(gòu)架師Adam Magee所說(shuō)虱肄,AOP的核心思想就是“將應(yīng)用程序中的商業(yè)邏輯同對(duì)其提供支持的通用服務(wù)進(jìn)行分離致板。”

實(shí)現(xiàn)AOP的技術(shù)咏窿,主要分為兩大類:一是采用動(dòng)態(tài)代理技術(shù)斟或,利用截取消息的方式,對(duì)該消息進(jìn)行裝飾集嵌,以取代原有對(duì)象行為的執(zhí)行萝挤;二是采用靜態(tài)織入的方式,引入特定的語(yǔ)法創(chuàng)建“方面”根欧,從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼怜珍。

如何使用spring Aop

我們經(jīng)常會(huì)用到的有如下幾種

    1、基于代理的AOP

    2凤粗、純簡(jiǎn)單[Java](http://lib.csdn.net/base/javase "Java SE知識(shí)庫(kù)")對(duì)象切面

    3酥泛、@Aspect注解形式的

    4、注入形式的Aspcet切面

開(kāi)發(fā)步驟:

I. 創(chuàng)建原始對(duì)象

II. 添加額外功能(Advice嫌拣、MethodInterceptor)

III. 切入點(diǎn)(PointCut)

IV. 組裝切面

spring Aop應(yīng)用場(chǎng)景

場(chǎng)景一:Aop與事務(wù)

使用基于注解的AOP事務(wù)管理
<tx:annotation-driven transaction-manager="transactionManager"/>
<aop:aspectj-autoproxy />

探索tx:annotation-driven標(biāo)簽:
<tx:annotation-driven/>標(biāo)簽是注解驅(qū)動(dòng)的事務(wù)管理支持的核心柔袁。

<tx:annotation-driven/>標(biāo)簽的屬性:
transaction-manager:指定到現(xiàn)有的PlatformTransactionManager bean的引用,通知會(huì)使用該引用异逐。default="transactionManager"
mode:指定Spring事務(wù)管理框架創(chuàng)建通知bean的方式捶索。可用的值有proxy和aspectj灰瞻。前者是默認(rèn)值腥例,表示通知對(duì)象是個(gè)JDK代理;后者表示Spring AOP會(huì)使用AspectJ創(chuàng)建代理酝润。
order:指定創(chuàng)建的切面的順序院崇。只要目標(biāo)對(duì)象有多個(gè)通知就可以使用該屬性。
proxy-target-class:該屬性如果為true就表示你想要代理目標(biāo)類而不是bean所實(shí)現(xiàn)的所有接口袍祖。default="false"

探索@Transactional注解:
你可以指定傳播、隔離級(jí)別谢揪、超時(shí)以及允許和不允許的異常蕉陋。
@Transactional注解的屬性:
propagation:指定事務(wù)定義中使用的傳播
isolation:設(shè)定事務(wù)的隔離級(jí)別
timeout:指定事務(wù)的超市(秒)
readOnly:指定事務(wù)的超時(shí)
noRollbackFor:目標(biāo)方法可拋出的異常所構(gòu)成的數(shù)組,但通知仍會(huì)提交事務(wù)
rollbackFor:異常所構(gòu)成的數(shù)組拨扶,如果目標(biāo)方法拋出了這些異常凳鬓,通知就會(huì)回滾事務(wù)

基于注解的事務(wù)管理小結(jié):
如果定義在類上,那么所有的方法都使用相同的方式患民,有些read就會(huì)抱怨給太多的東西了缩举。
如果在每個(gè)方法上都定義注解,那么就會(huì)很麻煩。
(可以使用XML AOP事務(wù)管理能更好的處理這種情況)

場(chǎng)景二:Aop與日志

使用AspectJ框架對(duì)操作日志進(jìn)行記錄

場(chǎng)景三:Aop與緩存

1 . 獲取到攔截方法的 @Cache 注解仅孩,并生成緩存 key托猩;

2 . 通過(guò)緩存 key,去緩存中獲取數(shù)據(jù)辽慕;

3 . 如果緩存命中京腥,執(zhí)行如下流程:

  • 如果需要自動(dòng)加載,則把相關(guān)信息保存到自動(dòng)加載隊(duì)列中溅蛉;
  • 否則判斷緩存是否即將過(guò)期公浪,如果即將過(guò)期,則會(huì)發(fā)起異步刷新船侧;
  • 最后把數(shù)據(jù)返回給用戶欠气。

4 . 如果緩存沒(méi)有命中,執(zhí)行如下流程:

  • 選舉出一個(gè) leader 回到數(shù)據(jù)源中去加載數(shù)據(jù)镜撩,加載到數(shù)據(jù)后通知其它請(qǐng)求從內(nèi)存中獲取數(shù)據(jù)(拿來(lái)主義機(jī)制)预柒;
  • leader 負(fù)責(zé)把數(shù)據(jù)寫入緩存;如果需要自動(dòng)加載琐鲁,則把相關(guān)信息保存到自動(dòng)加載隊(duì)列中卫旱;
  • 最后把數(shù)據(jù)返回給用戶。

緩存是用于解決高并發(fā)場(chǎng)景下系統(tǒng)的性能及穩(wěn)定性問(wèn)題的围段。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顾翼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奈泪,更是在濱河造成了極大的恐慌适贸,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涝桅,死亡現(xiàn)場(chǎng)離奇詭異拜姿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)冯遂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門蕊肥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蛤肌,你說(shuō)我怎么就攤上這事壁却。” “怎么了裸准?”我有些...
    開(kāi)封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵展东,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我炒俱,道長(zhǎng)盐肃,這世上最難降的妖魔是什么爪膊? 我笑而不...
    開(kāi)封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮砸王,結(jié)果婚禮上推盛,老公的妹妹穿的比我還像新娘。我一直安慰自己处硬,他們只是感情好小槐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著荷辕,像睡著了一般凿跳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疮方,一...
    開(kāi)封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天控嗜,我揣著相機(jī)與錄音,去河邊找鬼骡显。 笑死疆栏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惫谤。 我是一名探鬼主播壁顶,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼溜歪!你這毒婦竟也來(lái)了若专?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝴猪,失蹤者是張志新(化名)和其女友劉穎调衰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體自阱,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嚎莉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沛豌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趋箩。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖加派,靈堂內(nèi)的尸體忽然破棺而出阁簸,到底是詐尸還是另有隱情,我是刑警寧澤哼丈,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站筛严,受9級(jí)特大地震影響醉旦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一车胡、第九天 我趴在偏房一處隱蔽的房頂上張望檬输。 院中可真熱鬧,春花似錦匈棘、人聲如沸丧慈。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逃默。三九已至,卻和暖如春簇搅,著一層夾襖步出監(jiān)牢的瞬間完域,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工瘩将, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吟税,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓姿现,卻偏偏與公主長(zhǎng)得像肠仪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子备典,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348