1. 程式人生 > >Spring 學習(十五)——AOP 基礎之動態代理

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 介面進行描述,它使用類和方法作為連線點的查詢條件