AOP基礎(chǔ)概念

一、AOP基礎(chǔ)概念

二、Join point(連接點(diǎn))

程序執(zhí)行期間的某一個(gè)點(diǎn),例如執(zhí)行方法或處理異常時(shí)候的點(diǎn)。在 Spring AOP 中,連接點(diǎn)總是表示方法的執(zhí)行。org.aspectj.lang.JoinPoint 接口表示目標(biāo)類連接點(diǎn)對(duì)象,它定義這些主要方法。

org.aspectj.lang.ProceedingJoinPoint 繼承了 JoinPoint 接口,它新增了兩個(gè)方法(它們用于執(zhí)行連接點(diǎn)方法)。

三、Advice(通知)

通知是指一個(gè)切面在特定的連接點(diǎn)要做的事情。通知分為方法執(zhí)行前通知,方法執(zhí)行后通知,環(huán)繞通知等。許多 AOP 框架(包括 Spring)都將通知建模為攔截器,在連接點(diǎn)周圍維護(hù)一系列攔截器(形成攔截器鏈),對(duì)連接點(diǎn)的方法進(jìn)行增強(qiáng)。

四、Pointcut(切點(diǎn))

一個(gè)匹配連接點(diǎn)(Join point)的謂詞表達(dá)式。通知(Advice)與切點(diǎn)表達(dá)式關(guān)聯(lián),并在切點(diǎn)匹配的任何連接點(diǎn)(Join point)(例如,執(zhí)行具有特定名稱的方法)上運(yùn)行。切點(diǎn)是匹配連接點(diǎn)(Join point)的表達(dá)式的概念,是AOP的核心,并且 Spring 默認(rèn)使用 AspectJ 作為切入點(diǎn)表達(dá)式語(yǔ)言。

支持在切點(diǎn)定義中加入以下運(yùn)算符進(jìn)行復(fù)合運(yùn)算:

切點(diǎn)訪問(wèn)修飾符與類訪問(wèn)修飾符的性質(zhì)是相同的,它可以決定切點(diǎn)可以在哪些類中可使用。因?yàn)槊悬c(diǎn)僅利用方法名及訪問(wèn)修飾符的信息,所以一般定義方法的返回類型為 void ,并且方法體為空 。

五、Aspect(切面)

它是一個(gè)跨越多個(gè)類的模塊化的關(guān)注點(diǎn),它是通知(Advice)和切點(diǎn)(Pointcut)合起來(lái)的抽象,它定義了一個(gè)切點(diǎn)(Pointcut)用來(lái)匹配連接點(diǎn)(Join point),也就是需要對(duì)需要攔截的那些方法進(jìn)行定義;它定義了一系列的通知(Advice)用來(lái)對(duì)攔截到的方法進(jìn)行增強(qiáng)。

六、Target object(目標(biāo)對(duì)象)

被一個(gè)或者多個(gè)切面(Aspect)通知的對(duì)象,也就是需要被 AOP 進(jìn)行攔截對(duì)方法進(jìn)行增強(qiáng)(使用通知)的對(duì)象,也稱為被通知的對(duì)象。由于在 AOP 里面使用運(yùn)行時(shí)代理,所以目標(biāo)對(duì)象一直是被代理的對(duì)象。

七、AOP proxy(AOP 代理)

為了實(shí)現(xiàn)切面(Aspect)功能使用 AOP 框架創(chuàng)建一個(gè)對(duì)象,在 Spring 框架里面一個(gè) AOP 代理要么指 JDK 動(dòng)態(tài)代理,要么指 CgLIB 代理。

八、Weaving(織入)

是將切面應(yīng)用到目標(biāo)對(duì)象的過(guò)程,這個(gè)過(guò)程可以是在編譯時(shí)(例如使用 AspectJ 編譯器),類加載時(shí),運(yùn)行時(shí)完成。Spring AOP 和其它純 Java AOP 框架一樣,是在運(yùn)行時(shí)執(zhí)行植入。

一個(gè)連接點(diǎn)可以同時(shí)匹配多個(gè)切點(diǎn),而切點(diǎn)所對(duì)應(yīng)的增強(qiáng)在連接點(diǎn)上織入順序的規(guī)則是這樣的:
①如果在同一個(gè)切面類中聲明的增強(qiáng),則按照增強(qiáng)在切面類中定義的順序進(jìn)行織入;
②如果增強(qiáng)位于不同的切面類中,并且這些切面類都實(shí)現(xiàn)了org.springframework.core.Ordered 接口,則由 Ordered 方法的順序號(hào)決定(順序號(hào)小的先織入);
③如果增強(qiáng)位于不同的切面類中,但這些切面類沒(méi)有實(shí)現(xiàn)org.springframework.core.Ordered 接口,織入的順序是不確定的。

兩個(gè)切面類 A 與 B,都實(shí)現(xiàn)了 Ordered 接口,A 的順序號(hào)為 1,B 的順序號(hào)為 2。切面類 A 與 B 都定義了 3 個(gè)增強(qiáng),那么同時(shí)匹配這 6 個(gè)增強(qiáng)的織入順序如下圖所示:

九、Advisor

這個(gè)概念是從 Spring 1.2的 AOP 支持中提出的,一個(gè) Advisor 相當(dāng)于一個(gè)小型的切面,不同的是它只有一個(gè)通知(Advice),Advisor 在事務(wù)管理里面會(huì)經(jīng)常遇到。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容