系列三十四、代理(四)JDK动态代理 vs CGLIB动态代理

一、Spring AOP的底层实现机制是什么

动态代理。

二、什么动态代理

JDK动态代理和CGLIB动态代理。

三、这两者有什么区别

(1)JDK动态代理只为提供接口的类代理,不支持类的代理;

        a、JDK会在运行时为目标类生成一个动态代理类class com.sun.proxy.$Proxy*,备注:*为一个数字

        b、该代理类实现了目标类的所有接口

        c、调用时,代理类先去调用invoke里面的逻辑进行增强,接着再通过反射的方式调用目标方法,从而实现AOP

(2)如果代理类没有实现接口,那么Spring底层会使用CGLIB动态代理

        a、CGLIB的底层是通过ASM在运行时动态生成目标类的子类,然后重写目标类的所有方法进行增强

        b、调用时先通过代理类进行增强,再直接调用父类对应的方法进行调用目标方法,从而实现AOP

        注意事项:

                I、CGLIB由于是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的

                II、CGLIB除了生成代理类外,还会生成路由类、可以(但不是必须)让本类的方法进行增强,而不会像JDK代理那样,本类方法调用本类方法会导致AOP失效。

你可能感兴趣的:(Spring全家桶面试系列,java,开发语言)