spring的Aop代理的兩種實現

一、java動態代理

  1. 實現InvocationHandler接口,來創建自己的調用處理器;
  2. 爲Proxy指定ClassLoader對象和一組interface來創建動態代理;
  3. 通過反射獲得動態代理的構造函數,唯一參數類型爲是調用處理器的接口類型;
  4. 構造函數創建代理類實例,構造時調用處理器對象作爲參數被傳入;

 實例:

public class ProxyTest {
  public static void main(String[] args) {
    final X o = (X) Proxy.newProxyInstance(X.class.getClassLoader(), new Class[]{X.class}, new XIH<X>(new XImpl()));
    o.a();
    o.b();
  }

  static class XIH<T> implements InvocationHandler {
    private T t;

    XIH(T t) {
      this.t = t;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      System.out.println("通知開始!");
      final Object o = method.invoke(this.t, args);
      System.out.println("通知結束!");
      return o;
    }
  }
}


public interface X {
  void a();
  void b();
}

 二、cglib

  1. 運行期間擴展Java類和實現java接口;
  2. 高性能、高質量的java生成類庫;
  3. cglib封裝asm,可以運行期間動態生成java類;
  4. cglib用於AOP,java的Proxy必須基於接口,cglib沒有限制;

三、區別

  1.  java動態代理是利用反射機制生成一個利用代理接口的匿名類,在調用具體方法前調用InvocationHandler來處理;

  2. cglib動態代理是使用asm開源包,加載代理對象類的class文件,修改其字節碼生成子類進行處理;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章