#JDK动力学和CGLIB动力学的区别
Spring AOP 中有两种主要的动态方式,JDK 动态和 CGLIB 动态
JDK dynamic 只提供接口,不支持类。
1) JDK 将生成一个动态类 $proxy*。在运行时class .
2)该类实现了目标类的接口,该类实现了接口的所有方法增强。
3)调用时,**类首先调用处理类进行增强,然后通过反射调用目标方法。从而实现AOP
如果类没有实现接口,则 Spring AOP 选择使用 CGLIB 来动态定位该类。
1)CGLIB的底层是通过ASM在运行时动态生成目标类的子类。(还有其他相关类,主要是为了提高调用时的效率)生成多个,
2)并且会覆盖父类的所有方法进行增强,3)调用时,先通过类进行增强,然后直接调用父类的相应方法调用目标方法。从而实现AOP
CGLIB 通过继承是动态的,因此如果一个类被标记为 final,则无法使用 CGLIB 对其进行动画处理。
除了生成目标子类之外,CGLIB 还有一个 fastclass(路由类),该类可以(但不必)通过此类的方法调用进行扩充,而不会使 JDK 等方法调用增强功能失效。
很多人会比较JDK和CGLIB的性能,JDK动态生成类快,调用慢,CGLIB生成类慢,但后续调用。
速度快,在旧版本的 CGLIB 中比 JDK 快 10 倍左右,但实际上,每次版本升级时,JDK 的速度都要高得多,而且。
CGLIB仍然步履蹒跚。
在JDK动态和CGLIB动态的实验中,JDK7和8的动态性能在1W执行下比CGLIB好20%左右。
其他扩展。
1. 动态有什么用**
他可以创造对象。
在原有**不变、原有不变的情况下,原有功能得到增强(有点像装饰器模式)。
解耦允许您将业务功能与日志分离。
二、两种实现方式**
1) JDK动态**:
这是通过以下三个类实现的:proxy、method 和 invocationhandler。
要求目标类必须实现接口。
2)、CGLIB Dynamics**。
原则是继承。
通过创建子类来重写父类的方法,从而增强目标类方法。
3. JDK Dynamics** 演示**
开发步骤:创建目标类接口someservice
j**apackage com.mr.lee.service;
public interface someservice
override
public string doother()
为 InvocationHandler 接口创建一个实现类,该接口实现对目标方法的增强。
j**apackage com.mr.lee.dao;
import j**a.lang.reflect.invocationhandler;
import j**a.lang.reflect.method;
实现 InvocationHandler 接口以增强目标方法的功能。
public class myinvocationhandler implements invocationhandler
override
public object invoke(object proxy, method method, object args) throws throwable
return method.invoke(target,args);等效于 someserviceimpldosome() 方法。
使用类似 jdk 的代理创建**对象,实现创建对象的能力。
j**apackage com.mr.lee;
import com.mr.lee.dao.myinvocationhandler;
import com.mr.lee.service.someservice;
import com.mr.lee.service.someserviceimpl;
import org.junit.test;
import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;
import j**a.lang.reflect.invocationhandler;
import j**a.lang.reflect.proxy;
public class apptest
testpublic void shouldanswerwithtrue()
运行结果。 ``j**a
目前的执行方式是:dosome
当前执行时间:1664091059671
执行了 dosome 方法。
结束时间:1664091059671
目前的执行方式是:doother
执行了 doother 方法。
process finished with exit code 0
4. CGLIB新闻**。
APO的底层实现是动态的,AOP是动态的一种规范化。
原理是实现继承:创建一个子类,子类是**对象,目标类和方法一定不能是final的,