6、AOP設計思想

AOP思想

  • AOP是對OOP的一種補充
  • 面對對象(OOP)引入了繼承、多態、封裝、將系統的業務功能按照模塊劃分,每一個模塊用一個或多個類來表示。
  • 而對於一些系統功能,沒法使用OOP的思想來實現它們。這些系統功能每每穿插在業務功能的各處,和業務代碼耦合在一塊兒;並且系統功能每每會被重複使用,這就致使了模塊不利於複用,這就是使用OOP實現系統功能的弊端。
  • AOP即爲面向切面編程,它把系統需求按照功能分門歸類,把她們封裝在一個個切面中,而後再指定這些系統功能往業務功能中織入的規則。最後由第三方機構根據你指定的織入規則,將系統功能正和到業務功能中。

AOP的基本概念

  • 切面(Aspect):相似於OOP中的Class,以惡搞Aspect存放一個系統功能的全部邏輯;在ApplicationContext中由aop:aspect來配置;
  • 鏈接點(Joinpoint):程序執行過程當中的某一事件,如方法被調用、拋出異常時;
  • 切入點(Pointcut):它是一個表達式,用於肯定哪些類的哪些函數須要插入橫切邏輯;它只精確到函數,究竟要在函數執行的哪一個階段橫切邏輯,這就由通知的類型決定;
  • 通知(Advice):具體的橫切邏輯,Spring中有四種Advice編程

    • 前置通知(Before Advice)
    • 後置通知(After Advice)
    • 返回通知(After Return Advice)
    • 環繞通知(Around Advice)
    • 拋出異常後通知(After Throwing Advice)

動態代理

Spring有兩種實現AOP的方式:Java動態代理和Cglib。默認使用動態代理,當目標對象沒有實現接口時,就會使用後者。
image
代理模式中存在目標對象和代理對象,它們必須實現相同的接口。用戶直接使用代理對象,而代理對象會將用戶的請求交給目標對象處理。代理對象能夠對用戶的請求增長額外的處理。函數

jdk動態代理簡單例子

1.建立目標對象this

//目標對象接口
public interface Subject   
{   
  public void doSomething();   
}  

//目標對象實現
public class RealSubject implements Subject   
{   
  public void doSomething()   
  {   
    System.out.println( "call doSomething()" );   
  }   
}

2.建立代理對象邏輯處理類spa

public class ProxyHandler implements InvocationHandler   
{   
  private Object proxied;   

  public ProxyHandler( Object proxied )   
  {   
    this.proxied = proxied;   
  }   

  public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable   
  {   
    //在轉調具體目標對象以前,能夠執行一些功能處理

    //轉調具體目標對象的方法
    return method.invoke( proxied, args);  

    //在轉調具體目標對象以後,能夠執行一些功能處理
  }    
}

3.簡單調用,建立代理對象代理

RealSubject real = new RealSubject();   
Subject proxySubject = (Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(), 
     new Class[]{Subject.class}, 
     new ProxyHandler(real));

proxySubject.doSomething();
相關文章
相關標籤/搜索