AOP中關鍵性概念

A~小天發表於2020-10-11


連線點(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
  


   

相關文章