四、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.*))
 可以使用與或非和其他關係關聯

Tags: