Spring AOP两种动态代理对象实现方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hefenglian/article/details/82381432

一、JDK生成AopProxy代理对象

通过JDK的Proxy类的静态方法newProxyInstance方法得到最终的代理对象。该方法包含3个参数:
/**
三个参数:
一个类装载器loader,
一个代理接口interfaces,
一个Proxy回调方法所在的对象handler:这个对象需要实现InvocationHandler接口,该接口实现类定义了invoke()方法,提供代理对象的回调入口

在Proxy代理的接口方法被调用时,会触发invoke()方法的回调,这个回调方法完成了AOP编织实现的封装。
*/

RealSubjectInterface realSubjectProxy=(RealSubjectInterface)Proxy.newProxyInstance(loader,interfaces,handler);

具体概念理解请参考
https://blog.csdn.net/shiyiqijialimin/article/details/77101506

二、CGLIB生成AopProxy代理对象

cglib是一个代码生成的类库,可以在运行时动态生成某个类的子类,所以,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

代理对象的生成过程由Enhancer类实现,大概步骤如下:
1、生成代理类Class的二进制字节码;
2、通过Class.forName加载二进制字节码,生成Class对象;
3、通过反射机制获取实例构造,并初始化代理类对象。

参考https://blog.csdn.net/qq_26462167/article/details/78437160
.
…待补充

CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的结束拦截所有父类方法的调用,并顺势织入横切逻辑。
用户通过类CglibProxy 对象的getProxy(Class clazz)为一个类创建动态代理对象,CglibProxy 实现了MethodInterceptor接口 ,定义getProxy通过字节码技术动态创建子类实例(enhancer.create()),并重写intercept方法进行拦截,织入横切逻辑代码。

三、二者区别

jdk和cglib动态代理实现的区别
1、jdk动态代理生成的代理类和委托类实现了相同的接口;
2、cglib动态代理中生成的字节码更加复杂,生成的代理类是委托类的子类,且不能处理被final关键字修饰的方法;
3、jdk采用反射机制调用委托类的方法,cglib采用类似索引的方式直接调用委托类方法;

猜你喜欢

转载自blog.csdn.net/hefenglian/article/details/82381432
今日推荐