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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值