AOP中關鍵性概念
連線點(Joinpoint):程式執行過程中明確的點,如方法的呼叫,或者異常的丟擲.
目標(Target):被通知(被代理)的物件
注1:完成具體的業務邏輯
通知(Advice):在某個特定的連線點上執行的動作,同時Advice也是程式程式碼的具體實現,例如一個實現日誌記錄的程式碼(通知有些書上也稱為處理)
注2:完成切面程式設計
代理(Proxy):將通知應用到目標物件後建立的物件(代理=目標+通知),
例子:外科醫生+護士
注3:只有代理物件才有AOP功能,而AOP的程式碼是寫在通知的方法裡面的
切入點(Pointcut):多個連線點的集合,定義了通知應該應用到那些連線點。
(也將Pointcut理解成一個條件 ,此條件決定了容器在什麼情況下將通知和目標組合成代理返回給外部程式)
介面卡(Advisor):介面卡=通知(Advice)+切入點(Pointcut)
如何實現AOP
目標物件只負責業務邏輯程式碼
通知物件負責AOP程式碼,這二個物件都沒有AOP的功能,只有代理物件才有
1. AOP
即面向切面程式設計
2. AOP帶來的好處
讓我們可以 “專心做事”
案例:
public void doSameBusiness (long lParam,String sParam){
<-------------------
// 記錄日誌
log.info("呼叫 doSameBusiness方法,引數是:"+lParam);
// 輸入合法性驗證
if (lParam<=0){
throws new IllegalArgumentException("xx應該大於0");
}
if (sParam==null || sParam.trim().equals("")){
throws new IllegalArgumentException("xx不能為空");
}
// 異常處理
try{
... //核心業務邏輯
}catch(...){
}catch(...){
}
// 事務控制
tx.commit();
}
例子:病人做手術
外科醫生+護士
主刀醫生:理解為AOP中的目標,專注具體的業務邏輯操作
麻醉師和護士:理解為AOP中的通知,在某種特定的連線點上執行的動作
上述結合:AOP 代理物件:將通知應用到具體目標物件後建立物件
代理=目標+通知
只有代理物件才有AOP功能。
3 工具類org.springframework.aop.framework.ProxyFactoryBean用來建立一個代理物件,在一般情況下它需要注入以下三個屬性:
proxyInterfaces:代理應該實現的介面列表(List)
interceptorNames:需要應用到目標物件上的通知Bean的名字。(List)
target:目標物件 (Object)
4. 前置通知(org.springframework.aop.MethodBeforeAdvice):在連線點之前執行的通知()
案例:在購書系統當中使用AOP方式實現日誌系統
5. 後置通知(org.springframework.aop.AfterReturningAdvice):在連線點正常完成後執行的通知
案例:線上購書系統中,要求不修改BookBizImpl程式碼的情況下增加如下功能:對買書的使用者進行返利:每買本書返利3元。(後置通知)
即:每呼叫一次buy方法列印:“[銷售返利][時間]返利3元。”
6. 環繞通知(org.aopalliance.intercept.MethodInterceptor):包圍一個連線點的通知,最大特點是可以修改返回值,由於它在方法前後都加入了自己的邏輯程式碼,因此功能異常強大。
它通過MethodInvocation.proceed()來呼叫目標方法(甚至可以不呼叫,這樣目標方法就不會執行)
案例:修改日誌系統不光要輸出引數,還要輸出返回值(環繞通知)
# 這個介面裡面沒有定義方法,我們要求我們的類必須實現afterThrows這個方法
# public void afterThrowing( [Method method,] [Object args,] [Object target,] Throwable throwable );
# 前面三個引數都是可選的,只有第三個引數是必須的,同時我們還可以在同一個類中定義這個方法的多個版本,如:
# public void afterThrowing( MyException1 ex ) {}
# public void afterThrowing( MyException2 ex ) {}
# 具體那個方法被呼叫則根據具體的Exception來判斷,由AOP容器自動識別 執行
7. 異常通知(org.springframework.aop.ThrowsAdvice):這個通知會在方法丟擲異常退出時執行
案例: 書本價格為負數時丟擲一個異常,通過異常通知取消此訂單
8. 介面卡(org.springframework.aop.support.RegexpMethodPointcutAdvisor) 介面卡=通知(Advice)+切入點(Pointcut)
案例:通過介面卡解決發書評時也返利的問題
.*buy
相關文章
- AOP概念
- Vue 關鍵概念介紹Vue
- Yii2 關鍵概念
- Spring AOP概念理解Spring
- 區塊鏈相關的關鍵概念區塊鏈
- 資料庫和資料湖的關鍵概念性差異資料庫
- 對於Spring中AOP,DI,IoC概念的理解Spring
- [譯] 理解 Apache Airflow 的關鍵概念ApacheAI
- 現代前端架構:關鍵概念指南前端架構
- Spring中AOP相關原始碼解析Spring原始碼
- 零基礎掌握區塊鏈關鍵概念區塊鏈
- Idea全域性搜尋關鍵字Idea
- spring之AOP的概念及簡單案例Spring
- Spring基礎只是—AOP的概念介紹Spring
- Spring IOC/AOP原理極簡概念入門Spring
- 吊打面試官!業務架構的關鍵概念面試架構
- 閉包概念是掌握React.JS的關鍵 - NitsanReactJS
- 理解Oracle WebLogic伺服器的關鍵概念(三)ZXOracleWeb伺服器
- 理解Oracle WebLogic伺服器的關鍵概念(二)KJOracleWeb伺服器
- 理解Oracle WebLogic伺服器的關鍵概念(一)XBOracleWeb伺服器
- java中this關鍵字Java
- 一次性帶你弄懂java中的static關鍵字Java
- aop 階段性概況
- 安卓開發(Java)中關於final關鍵字與執行緒安全性安卓Java執行緒
- .NET8 Blazor 從入門到精通:(一)關鍵概念Blazor
- DotNetty關鍵概念及簡單示例(基於NET5)Netty
- Spring中AOP相關的API及原始碼解析SpringAPI原始碼
- 理解Spring(二):AOP 的概念與實現原理Spring
- Spring-1-AOP概念簡述-程式碼演示Spring
- 《AOP挖掘記》概念介紹及原理初探(一)
- Java中final關鍵字Java
- scala中yield關鍵字
- 語音訊號處理入門系列(2)——訊號處理中的幾個關鍵概念音訊
- Spring-boot整合AOP及AOP相關學習Springboot
- 管理系統中風險是系統可用性和可擴充套件性的關鍵套件
- 【趣味】0基礎快速掌握區塊鏈服務關鍵概念區塊鏈
- 關於sass、scss、less的概念性知識彙總CSS
- 聊一聊 AOP :表現形式與基礎概念