前言:
JDK与CGLIB代理差异
- JDK动态代理:代理对象必须为某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理
- CGLIB代理:原理类似于JDK代理,不同之处在于运行期间生成的代理对象是针对目标类扩展的子类,CGLIB是高效代码生成包,底层是依靠ASM(字节码编辑类库)操作字节码实现的,性能比JDK强。
- expose-proxy 目标对象内部的自我调用将无法实施切面中的增强,如下代码:
- 3
- 4
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
此处的this指向目标对象,this.b();将不会执行对b函数的切面,不会实现增强,可用如下方式解决此问题:
- 1
- 1
并且将 this.b(); 修改为如下代码即可:
exposeProxy
:确定当前代理是否应该被暴露,
ThreadLocal
以便它可以被目标访问。如果目标需要获取代理并且
exposeProxy
属性设置为
true
,则目标可以使用该
AopContext.currentProxy()
方法