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