前面我們完成了對(duì)Spring IOC容器技術(shù)的學(xué)習(xí),從本篇文章開(kāi)始我們將開(kāi)始學(xué)習(xí)Spring的另一個(gè)核心技術(shù)——Spring AOP技術(shù)。面向切面編程(Aspect Oriented Programming)簡(jiǎn)稱AOP。
AOP技術(shù)的學(xué)習(xí)我們需要對(duì)java反射和代理技術(shù)有一定的了解,若你還不太了解java反射和代理技術(shù),可以先對(duì)該類技術(shù)有簡(jiǎn)單了解后,繼續(xù)本篇文章的學(xué)習(xí)。
一、AOP技術(shù)
AOP(Aspect Oriented Programming),面向切面編程。為面向?qū)ο缶幊蹋∣OP)提供了另一種思考應(yīng)用架構(gòu)的方式。面向?qū)ο缶幊痰年P(guān)鍵模塊單元是類,而在AOP中關(guān)鍵的模塊單元為切面(Aspect)。切面可以實(shí)現(xiàn)關(guān)注點(diǎn)的模塊化,例如跨越多種類型和對(duì)象的事務(wù)管理。有了AOP技術(shù),我們便可方便的解決分布于系統(tǒng)各個(gè)模塊中的交叉關(guān)注點(diǎn)的問(wèn)題,如:事務(wù)管理、安全檢查、緩存和對(duì)象池管理等。
二、AOP基本概念
本小節(jié)我們介紹一些AOP的一些基本概念和專用術(shù)語(yǔ)。
概念 | 描述 |
---|---|
Aspect(切面) | 橫跨多個(gè)類的關(guān)注面的模塊化 |
Join point(連接點(diǎn)) | 在程序運(yùn)行時(shí)的某個(gè)點(diǎn):一般指某個(gè)方法或異常處理 |
Advice(增強(qiáng)處理) | 切面在特定切點(diǎn)所執(zhí)行的操作 |
Pointcut(切點(diǎn)) | 匹配連接點(diǎn)的表達(dá)式,Advice與Pointcut表達(dá)式關(guān)聯(lián)并且Advice將在與Pointcut匹配的所有Joint point |
Introduction | |
Target object | 被一個(gè)或多個(gè)切面增強(qiáng)處理的對(duì)象, |
AOP proxy | AOP代理 |
Weaving(織入) | 將切面與目標(biāo)對(duì)象進(jìn)行連接。這可以在編譯期(AspectJ)、加載期、運(yùn)行期(Spring AOP) |
Advice類型:
類型 | 描述 |
---|---|
Before advice | 在連接點(diǎn)(Joint point)前執(zhí)行該增強(qiáng)操作 |
After returning advice | 在連接點(diǎn)正常返回后執(zhí)行該增強(qiáng)操作 |
After throwing advice | 在連接點(diǎn)拋出異常時(shí)執(zhí)行該增強(qiáng)操作 |
After (finally) advice | 在連接點(diǎn)執(zhí)行結(jié)束后執(zhí)行該增強(qiáng)操作(無(wú)論正常退出還是異常退出) |
Around advice | 包裹連接點(diǎn)的執(zhí)行操作,該類型可以攔截連接點(diǎn)的執(zhí)行 |
三、Spring AOP 支持
Spring AOP是由純java語(yǔ)言實(shí)現(xiàn),因此并不需要特殊的處理,目前Spring AOP僅支持方法運(yùn)行連接點(diǎn),如果你需要屬性訪問(wèn)和更新連接點(diǎn),可考慮使用AspectJ,Spring對(duì)AspectJ有完善的支持,但這超出了本篇所要學(xué)習(xí)的重點(diǎn),有興趣的讀者可自行查閱學(xué)習(xí),本文我們主要學(xué)習(xí)Spring AOP相關(guān)知識(shí)。
Spring默認(rèn)使用JDK的動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)AOP代理,但由于JDK的動(dòng)態(tài)代理只支持對(duì)接口的代理,因此如果你需要對(duì)類進(jìn)行代理,Spring同時(shí)也提供了CGLIB的代理方式。但一般的商業(yè)代碼都會(huì)要求代碼實(shí)現(xiàn)一個(gè)或多個(gè)商業(yè)接口,因此一般情況下JDK的動(dòng)態(tài)代理足以使用。總之,無(wú)論是JDK動(dòng)態(tài)代理還是CGLIB的代理,Spring良好的封裝使得這一切對(duì)普通開(kāi)發(fā)者透明。
Spring AOP為我們提供了兩種方式來(lái)定義切面、切點(diǎn)等關(guān)心信息:
- @AspectJ方式:該方式使用注解的方式來(lái)定義AOP主要概念,Spring AOP使用和AspectJ 5相同的注解定義。
- 基于XML配置方式
保持一貫風(fēng)格且使學(xué)習(xí)便于理解,我們本次Spring AOP依然采用XML的配置方式進(jìn)行學(xué)習(xí)。
四、總結(jié)
本文我們了解了AOP技術(shù)、AOP的基本概念以及Spring的AOP支持,接下來(lái)我們將以XML配置的方式講解Spring AOP的切面(Aspect)、切點(diǎn)(pointcut)等的定義和AOP的使用。