JDK动态代理和CGLIB动态代理的区别
-
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理
-
JDK动态代理
-
JDK动态代理只提供接口的代理,不支持类的代理。
-
JDK会在运行时为目标类生成一个动态代理类proxy*.class 该代理类是实现了接目标类接口的一个类,并且会实现接口所有的方法增强代码。 标方法。从而实现AOP调用时先去调用处理类进行增强,再通过反射的方式进行调用如果代理类没有实现 接口。
- CGLIB动态代理
-
CGLIB的底层是通过ASM在运行时动态的生成目标类的一个子(还有其他相关类)会生成多个 并且会重写父类所有的方法增强代码
-
调用时先通过代理类进行增强,再直接调用父类对应的方法进行调用目标方法。从而实现AOP。
-
CGLIB是通过继承的方式做的动态代理,因此如果某个类标记为final,那么它是无法使用CGLIB做动态代理的。