Spring默认(如果类实现了接口)走的是JDK的动态代理。JDK动态代理需要目标对象必须实现接口。JDK的动态代理生成的代理对象,和原目标对象实现相同的接口。和原对象是兄弟关系。

    如果类没有实现接口,则走CGLIB代理。不要求实现接口,生成的代理对象和原目标对象是继承关系。要求目标对象的类不能是最终类。

    也可以手动强制设置Spring使用CGLIB,@EnableAspectJAutoProxy(proxyTargetClass = true)

    CGLIB的代理对象,包名和原对象一致;JDK代理对象,包名为com.sun.proxy。会引发后期一些服务框架的bug。建议大家统一使用CGLIB,保持包名不变。

    动态代理相关资料:

    1. [https://www.bilibili.com/video/BV1M54y1X78p](https://www.bilibili.com/video/BV1M54y1X78p)