Spring 學習(十五)——AOP 基礎之動態代理
AOP 前奏
WHY AOP ?
需求1-日誌:在程式執行期間追蹤正在發生的活動
需求2-驗證:希望計算器只能處理正數的運算
程式碼實現片段
問題
•程式碼混亂:越來越多的非業務需求(日誌和驗證等)加入後, 原有的業務方法急劇膨脹. 每個方法在處理核心邏輯的同時還必須兼顧其他多個關注點.
•程式碼分散: 以日誌需求為例, 只是為了滿足這個單一需求, 就不得不在多個模組(方法)裡多次重複相同的日誌程式碼. 如果日誌需求發生變化, 必須修改所有模組.
使用動態
•代理設計模式的原理: 使用一個代理將物件包裝起來, 然後用該代理物件取代原始物件. 任何對原始物件的呼叫都要通過代理. 代理物件決定是否以及何時將方法呼叫轉到原始物件上.
CalculatorLoggingHandler
CalculatorValidationHandler
測試程式碼
AOP 簡介
•AOP(Aspect-Oriented Programming, 面向切面程式設計): 是一種新的方法論, 是對傳統 OOP(Object-Oriented Programming,
•AOP 的主要程式設計物件是切面(aspect), 而切面模組化橫切關注點.
•在應用 AOP 程式設計時, 仍然需要定義公共功能, 但可以明確的定義這個功能在哪裡, 以什麼方式應用, 並且不必修改受影響的類. 這樣一來橫切關注點就被模組化到特殊的物件(切面)裡.
•AOP 的好處:
–每個事物邏輯位於一個位置, 程式碼不分散, 便於維護和升級
–業務模組更簡潔, 只包含核心業務程式碼.
AOP
AOP 術語
•切面(Aspect): 橫切關注點(跨越應用程式多個模組的功能)被模組化的特殊物件
•通知(Advice): 切面必須要完成的工作
•目標(Target): 被通知的物件
•代理(Proxy): 向目標物件應用通知之後建立的物件
•連線點(Joinpoint):程式執行的某個特定位置:如類某個方法呼叫前、呼叫後、方法丟擲異常後等。連線點由兩個資訊確定:方法表示的程式執行點;相對點表示的方位。例如 ArithmethicCalculator#add() 方法執行前的連線點,執行點為 ArithmethicCalculator#add(); 方位為該方法執行前的位置
•切點(pointcut):每個類都擁有多個連線點:例如 ArithmethicCalculator 的所有方法實際上都是連線點,即連線點是程式類中客觀存在的事務。AOP 通過切點定位到特定的連線點。類比:連線點相當於資料庫中的記錄,切點相當於查詢條件。切點和連線點不是一對一的關係,一個切點匹配多個連線點,切點通過 org.springframework.aop.Pointcut 介面進行描述,它使用類和方法作為連線點的查詢條件。