JDK和CGLIB动态代理区别

背景:虽然自己了解这两种代理的区别,但是面试时候还是答的很模糊,需要好好总结。

前言
JDK动态代理实现原理(jdk8):https://blog.csdn.net/yhl_jxy/article/details/80586785

CGLIB动态代理实现原理:https://blog.csdn.net/yhl_jxy/article/details/80633194

定义

JDK动态代理
利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,

在调用具体方法前调用InvokeHandler来处理。

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

实现CGLIB动态代理必须实现MethodInterceptor(方法拦截器)接口

区别

jdk只能针对接口不能针对类实现代理。

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动态代理区别

ps:总结的很到位

上一篇:关于svn上传.classpath等问题


下一篇:Publish to a Linux Production Environment