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(new XImpl()));
    o.a();
    o.b();
  }

  static class XIH 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文件,修改其字节码生成子类进行处理;

你可能感兴趣的:(java,spring,java)