Core - AOP
Last updated
Was this helpful?
Last updated
Was this helpful?
原名: Aspect-oriented programming, AOP,針對業務處理過程的實體及其屬性和行為進行抽象封裝,以或得更加清晰高效的邏輯單元劃分,並沒有解決問題,而是提供了更好的開發模式。
❗ 如果沒有劃分,容易讓程式碼原本的主服務流程和系統考量交雜再一起,造成難以維護。
Example:開發人員可以在不改變原來業務邏輯模型的基礎下,進行動態的增加日誌 (Log)、安全(Security)、 交易事務(Transaction) 或 異常處理(Exception) 等等功能。
涉及多個關注的模組化。
在應用程序模塊中具有的行為。可以定義我們要解決特定業務問題的功能。
用於整個應用程序 (或多個模塊) 的多處 concern。
例如,日誌記錄,安全性和數據傳輸幾乎每個 concern 中可能都需要的 。
程序的執行點(一個點),例如:方法的執行或異常的處理。
在Spring AOP中,Join point 始終表示方法執行。
🍀 可以想像成使用 log 的時機點。
在與 Join point 的任何接點處運行,可能是與連接點的謂詞(Predicate) 或 表達式(expression)。
🍀 有點像切片,可以想像成紀錄 log 的工具。
Before 在 join point 方法執行前執行,並使用 @Before 註解配置。
After Returning 在 join point 方法執行後執行,並使用 @AfterReturning 註解配置。
After Throwing 在 join point 方法拋出異常退出並使用 @AfterThrowing 註解配置時執行。
After (finally) 在 join point 方法執行後執行,無論方法退出是否正常,並使用@After 註解配置。
Around 在 join point 之前和之後執行,並使用 @Around 註解配置。
使 Aspect 可以聲明建議對象實現它們實際上沒有實作的介面,並代表那些對象提供該介面的實現。
一個或多個被切面通知的業務對象。
由 AOP 創建的一個對象,即透過動態代理產出來的對象。
即在給定的 join point 將 Advice 應用於 Target 對象以獲得 Proxy 對象的過程。
可以在編譯、加載或運行時執行,Spring AOP 僅在運行時執行, AspectJ 可以在編譯或加載時執行。
AOP 框架動態生成的一個對象,該對象可作為目標對象使用,且由 Spring IOC 容器負責生成、管理,其依賴關係也由 IOC 容器負責。
包含了目標對象的全部方法,但 AOP 代理中的方法與目標對象的方法存在差異,AOP 方法在特定切入點添加了增強處理,並回調了目標對象的方法。
Spring AOP 目前只支持在方法的執行上,且官方建議在 Bean 的方法上執行。
透過 JDK 動態代理 或是 CGlib (Code Generation Library) 動態代理。
若類別有實作任何一個介面,將會使用 JDK 動態代理,代理目標類別的所有介面。 若沒有,則預設使用 CGlib 動態代理。
若使用 CGlib 動態代理,不能透過 final 定義方法,否則無法透過子類別覆蓋並增強。
可以直接設置 ProxyFactory 生成的方式,即使實現了介面,也能使用CGlib。
https://www.jianshu.com/p/c107e617ef76 https://kknews.cc/zh-tw/code/zel9q4q.html https://juejin.im/post/5eb5695a6fb9a043632a12d6