- JDK方式:
- jdk动态代理实现InvocationHandler 接口,
- 内部通过Proxy.newProxyInstance()方法指定 类加载器和一个代理接口数组(proxiedInterfaces)
- 通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型;
- 面向接口
- CGLib方式:
- CGLib动态代理是通过字节码底层继承要代理类来实现(如果被代理类被final关键字所修饰,那么抱歉会失败)。
- 通过MethodInterceptor接口实现
- 使用:
- 被代理类是实现了接口的类,那么通过jdk方式
- 被代理类没有实现接口,强制CGLib方式
- 性能(1.8之前)
- CGLib创建的动态代理对象运行时比jdk方式的速度快
- CGLib创建动态代理对象时比jdk的方式慢
- 单例模式下使用CGLib的方式
- 需要频繁创建对象的时候使用jdk的方式.
- jdk1.8之后jdk的代理方式很快