spring中,通过cglib实现aop的动态代理时,FastClass有几种实现,分别怎么使用,有什么区别?
时间: 2024-04-21 10:25:19 浏览: 201
在Spring框架中,通过CGLIB实现AOP的动态代理时,FastClass有两种实现:FastClass和FastClassEmitter。
1. FastClass:使用反射来调用被代理方法,适用于被代理方法数量不多的情况。
2. FastClassEmitter:使用动态生成的字节码来调用被代理方法,适用于被代理方法数量较多的情况。
在Spring中,默认情况下会根据代理的目标类的方法数量来选择使用哪种FastClass实现。如果目标类的方法数量小于等于5,则使用FastClass,否则使用FastClassEmitter。可以通过设置system property "spring.aop.fast-class-by-cglib"来指定使用哪种实现。
使用FastClass和FastClassEmitter实现的代理对象在性能上没有明显差异,但是FastClassEmitter的实现可以更好地处理大量的方法调用。
相关问题
spring中,通过cglib实现aop的动态代理时,method.invoke和method.invokeSuper有什么区别,使用上有什么不一样?
在使用 cglib 实现 AOP 动态代理时,method.invoke 和 method.invokeSuper 都是用来调用原始方法的,但是二者有一些不同之处。
具体来说,method.invoke 是直接调用原始方法,而 method.invokeSuper 则是调用被代理类的父类方法,也就是说,如果被代理对象是一个子类,则 method.invokeSuper 会调用父类中的方法,而 method.invoke 则只会调用子类中的方法。
在使用上,method.invoke 和 method.invokeSuper 的区别在于传入的参数不同。method.invoke 需要传入被代理对象和方法的参数,而 method.invokeSuper 则只需要传入被代理对象的实例和方法的参数。
需要注意的是,如果被代理对象是一个接口,则无法使用 cglib 实现动态代理,而只能使用 JDK 自带的动态代理。
spring中,通过cglib实现aop的动态代理时,method.invoke和method.invokeSuper有什么区别
在Spring框架中,通过CGLIB实现AOP的动态代理时,method.invoke和method.invokeSuper主要有以下区别:
1. method.invoke:调用代理对象的方法,可以在方法执行前后加入增强逻辑。
2. method.invokeSuper:调用被代理对象的方法,不会触发代理对象的增强逻辑,只有被代理对象的增强逻辑会被执行。
在AOP中,代理对象的方法通常会被增强,而被代理对象的方法不会被增强。因此,在使用CGLIB实现AOP的动态代理时,通常会使用method.invoke方法来调用代理对象的方法,并在方法执行前后加入增强逻辑。而对于被代理对象的方法,可以使用method.invokeSuper方法来调用,以避免重复触发代理对象的增强逻辑。
需要注意的是,在使用method.invokeSuper方法时,必须将当前对象作为第一个参数传递给该方法,以便被代理对象在执行方法时能够正常访问其成员变量和方法。
阅读全文