四、Spring-面向切面程式設計

魚換水發表於2020-05-28

內容

  • 面向切面程式設計基本原理
  • 通過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.*))
 可以使用與或非和其他關係關聯

相關文章