两种动态代理:JDK实现和CGLIB字节码生成文件

JDK实现动态代理:

利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

cglib动态代理

利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

动态代理分为两种:
* jdk的动态代理
* 代理对象和目标对象实现了共同的接口
* 拦截器必须实现InvocationHanlder接口

  *  cglib的动态代理(要用到cglib的jar包)
     *  代理对象是目标对象的子类
     *  拦截器必须实现MethodInterceptor接口
     *  hibernate中session.load采用的是cglib实现的

JDK动态代理和CGLIB字节码生成的区别?
1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类。

2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,
并覆盖其中方法实现增强,但是因为采用的是继承,所以该类或方法最好不要声明成final,
对于final类或方法,是无法继承的。

Spring如何选择用JDK还是CGLiB?

1)当Bean实现接口时,Spring就会用JDK的动态代理。

2)当Bean没有实现接口时,Spring使用CGlib是实现。

3)可以强制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy proxy-target-class=“true”/>)。

JDK和CGLIB动态代理总结

JDK代理是不需要第三方库支持,只需要JDK环境就可以进行代理,使用条件:

1)实现InvocationHandler

2)使用Proxy.newProxyInstance产生代理对象

3)被代理的对象必须要实现接口

CGLib必须依赖于CGLib的类库,但是它需要类来实现任何接口代理的是指定的类生成一个子类,
覆盖其中的方法,是一种继承但是针对接口编程的环境下推荐使用JDK的代理;

部分转自:https://blog.csdn.net/yhl_jxy/article/details/80635012

猜你喜欢

转载自blog.csdn.net/mulinsen77/article/details/86565891
今日推荐