Core - AOP

目的是在 AOP 實現和 Spring IOC 之間提供集成,以幫助解決企業應用程序中的常見問題

IOC 不依賴 AOP,而是提供另一種思考程序結構的方式,來 "補充" OOP (面向對象設計)。

切面導向工程

原名: Aspect-oriented programming, AOP,針對業務處理過程的實體及其屬性和行為進行抽象封裝,以或得更加清晰高效的邏輯單元劃分,並沒有解決問題,而是提供了更好的開發模式

如果沒有劃分,容易讓程式碼原本的主服務流程系統考量交雜再一起,造成難以維護

Example:開發人員可以在不改變原來業務邏輯模型的基礎下進行動態的增加日誌 (Log)、安全(Security)、 交易事務(Transaction) 異常處理(Exception) 等等功能。

術語概念

Aspect 切面

涉及多個關注的模組化。

🔸 concern 核心(主要)關注點

在應用程序模塊中具有的行為可以定義我們要解決特定業務問題的功能。

🔸 Cross-cutting concerns 橫切關注點

用於整個應用程序 (或多個模塊) 的多處 concern。

例如,日誌記錄,安全性和數據傳輸幾乎每個 concern 中可能都需要的 。

Join point 連接點(核心)

程序的執行點(一個點),例如:方法的執行或異常的處理。

在Spring AOP中,Join point 始終表示方法執行。

🍀 可以想像成使用 log 的時機點。

PointCut 切入點(核心)

在與 Join point 的任何接點處運行,可能是與連接點的謂詞(Predicate) 或 表達式(expression)。

🍀 有點像切片,可以想像成紀錄 log 的工具。

Advice 通知

aspect 在特定的 joint point 採取的操作。

  • Before 在 join point 方法執行前執行,並使用 @Before 註解配置。

  • After Returning 在 join point 方法執行後執行,並使用 @AfterReturning 註解配置。

  • After Throwing 在 join point 方法拋出異常退出並使用 @AfterThrowing 註解配置時執行。

  • After (finally) 在 join point 方法執行後執行,無論方法退出是否正常,並使用@After 註解配置。

  • Around 在 join point 之前之後執行,並使用 @Around 註解配置。

Introduction 引入

使 Aspect 可以聲明建議對象實現它們實際上沒有實作的介面,並代表那些對象提供該介面的實現。

Target object 目標

一個或多個被切面通知的業務對象。

Proxy 代理

由 AOP 創建的一個對象,即透過動態代理產出來的對象

Weaving 織入

即在給定的 join point 將 Advice 應用於 Target 對象以獲得 Proxy 對象的過程

可以在編譯、加載或運行時執行,Spring AOP 僅在運行時執行, AspectJ 可以在編譯或加載時執行。

實作原理

AOP 框架動態生成的一個對象,該對象可作為目標對象使用,且由 Spring IOC 容器負責生成、管理,其依賴關係也由 IOC 容器負責。

包含了目標對象的全部方法,但 AOP 代理中的方法與目標對象的方法存在差異,AOP 方法在特定切入點添加了增強處理,並回調了目標對象的方法。

circle-exclamation

如何實現

透過 JDK 動態代理 或是 CGlib (Code Generation Library) 動態代理

注意事項

  • 若類別有實作任何一個介面,將會使用 JDK 動態代理,代理目標類別的所有介面。 若沒有,則預設使用 CGlib 動態代理。

  • 若使用 CGlib 動態代理,不能透過 final 定義方法,否則無法透過子類別覆蓋並增強。

  • 可以直接設置 ProxyFactory 生成的方式,即使實現了介面,也能使用CGlib。

JDK 代理(Proxy)chevron-right動態代理(CGlib)chevron-right

參考資料

https://www.jianshu.com/p/c107e617ef76arrow-up-right https://kknews.cc/zh-tw/code/zel9q4q.htmlarrow-up-right https://juejin.im/post/5eb5695a6fb9a043632a12d6arrow-up-right

Last updated