四、Spring-面向切面編程
內容
- 面向切面編程基本原理
- 通過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.*))
可以使用與或非和其他關係關聯