內容
- 面向切面程式設計基本原理
- 通過POJO建立切面
- 使用@AspectJ註解
- 為AspectJ切面注入依賴
關鍵詞
- 橫切關注點(cross-cutting concern)
- 繼承 (inheritance)
- 委託 (delegation)
- 通知 (advice)
- 切點 (pointcut)
- 連線點 (join point)
4.1 面向切面程式設計
日誌是應用切面的常見範例,其他常見還包括宣告式事務、安全和快取
那麼什麼是切面程式設計?
在程式碼中的一個地方定義通用功能,通過宣告的方式被呼叫,而無需修改其他類。那麼該模組化的特殊類,就被稱之為切面(Aspect)。可以使關注程式碼集中管理,而不是分散式管理;服務模組更加簡潔,更多的關注於核心程式碼,而切面類的程式碼就可以使次要關注點。
4.1.1 定義AOP術語
- 通知 (advice)
- 切點 (pointcut)
- 連線點 (join point)
通知:切面的工作被稱之為通知。通知定義了切面是什麼以及何時使用,還解決了什麼時候執行的問題。
五種型別的通知
名詞 | 說明 |
---|---|
前置通知(Before) | 在目標方法被呼叫之前呼叫通知功能 |
後置通知(After) | 在目標方法完成之後呼叫通知,此時不會關心方法的輸出是什麼 |
返回通知(After-returning) | 在目標方法執行成功後通知 |
異常通知(After-throwing) | 在目標方法丟擲異常後通知 |
環繞通知(Around) | 通知包裹了被通知的方法,在被通知的方法呼叫之前和呼叫之後執行自定義的行為。 |
連線點:是在應用執行過程中能夠插入切面的一個點。這個點可以是呼叫方法時、丟擲異常時、甚至是修改一個欄位時。切面程式碼可以利用這些點插入到應用的正常流程之中,並新增新的行為。
切點:通知定義了“何時”和“什麼”,那麼切點就定義了“何處”。切點的定義通常會匹配通知所要織入的一個或多個連線點。通常會指定明確的類或者方法,但是也會使用正則等進行類和方法的匹配。
切面:切面=通知+切點;即闡明瞭“何時”在“何處”執行了“什麼”。
引入(Introduction):引入允許我們向現有的類新增新方法或屬性
織入(Weaving):織入是把切面應用到目標物件並建立新的代理物件的過程。切面在指定的連線點被織入到目標物件中。在目標物件的生命週期裡有多個點可以進行織入。
- 編譯期:切面在目標類編譯時被織入。
- 類載入期:切面在目標類載入到JVM時被織入。
- 執行期:切面在應用執行的某個時刻被織入。
4.2 切點表示式語言
AspectJ指示器 | 描述 |
---|---|
arg | 限制連線點匹配引數為指定型別的執行方法 |
@args() | 限制連線點匹配引數為指定註解的執行方法 |
execution() | 用於匹配時連線點的執行方法 |
this() | 限制連線點匹配AOP代理的bean引用為指定型別的類 |
target | 限制連線點匹配目標物件為指定型別的類 |
@target() | 限制連線點匹配特定的執行物件,這些物件對應的類要具有指定型別的註解 |
within() | 限制連線點匹配指定的型別 |
@within() | 限制連線點匹配指定註解所標註的型別 |
@annotation | 限制連線點匹配帶有指定註解的連線點 |
1. execution(* concert.Performance.perform(..))
* 為返回任意型別
concert.Performance為方法所屬類
perform 方法
(..) 任意引數
2. execution(* concert.Performance.perform(..) &&(||、!) within(concert.*))
可以使用與或非和其他關係關聯