什么是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)題的围段。