天天看點

面向切面程式設計--Spring AOP

前言

學習JAVA剛開始都會接觸到OOP(封裝 繼承 多态),這些概念将對象公共的行為抽離出來,使代碼變得簡潔易維護。但如果要将不同的對象引入一個公共的行為時,OOP就比較無能為力了。比較典型的就是項目中的日志功能,這個功能散布于各個不同的對象的每個層次中(執行前,執行後,異常),如果在每個需要日志功能的地方都添加一個,将會出現大量備援的代碼,且這些代碼本身和業務并無太大聯系,也使得業務更難了解,甚至還要加上更多處理才能讓這塊代碼不影響到核心業務的執行。這時就引入了AOP的概念,它将不同對象的不同層次定義為切面,AOP也是面向切面程式設計,将核心業務行為和公共通用行為分離開,這就是它的目的。

需要加入的功能,比如上面提到的日志。

項目執行中允許你通知的地方。

切入點是在連接配接點的基礎上定義的,比如一個類中有10個連接配接點,你隻想通知其中5個,那這5個連接配接點你就可以定義為切入點。

切入點和通知的結合,切入點表示“在什麼地方做”,通知表示“做什麼”和“什麼時候做”,兩個結合表明“在什麼時候什麼地方做什麼”,這就是一個完整的切面定義。

向現有的類添加方法屬性。就是将切面在目标類中使用。

将切面引入目标對象建立一個新的代理類的過程。

文章示例使用JDK1.8+SpringBoot架構進行講解。小夥伴們要有一定的SpringBoot使用經驗。

1.aop

2.junit

正文

在目标方法執行前織入增強處理。

下面的這段就是在測試代碼執行前獲得請求的參數和IP位址,并列印日志。

執行後,控制台列印:

可以看到,在每個方法執行前,都列印了一條日志,這就是前置增強。

在目标方法執行後織入增強處理。

這裡有兩個注解需要注意以下,@After和@AfterReturning,@AfterReturning如果方法異常或其他原因中斷了,是通知不到的,@After是任何情況都能通知得到。我們這裡用@AfterReturning。

後置增強可以拿到方法傳回值,是以我們在日志輸出裡增加了個傳回值,運作效果如下:

後置增強相對于前置增強的位置變了,前置增強是在目标方法執行前,而後置增強是在目标方法執行後,并且可以獲得傳回值。

在目标方法執行前後織入增強處理。

環繞增強從名字就可以看出,可以針對目标方法前後都進行增強處理。

舉個栗子,我們要在方法執行前日志列印參數,方法執行後列印傳回值,就可以這麼寫:

結果如下:

不知道大家有沒有注意到,環繞增強的入參由JoinPoint變成了ProceedingJoinPoint,點進去可以看到ProceedingJoinPoint繼承了JoinPoint并且在原本的接口上暴露了proceed()方法。這個方法就是讓目标方法執行,這樣才能支援環繞通知。

結尾

上面主要講到了前置增強,後置增強和環繞增強這三種常用的,還有其他的比如異常增強等其他增強下篇文章再讨論。如果發現錯誤或者我了解錯了的地方,歡迎大家及時指正。

繼續閱讀