Spring AOP默认使用CGLIB代理(Spring Boot 2.x+中spring.aop.proxy-target-class=true),仅当显式设为false时才优先使用JDK动态代理(需目标类实现接口,否则仍回退CGLIB)。

Spring AOP 默认使用 CGLIB 动态代理(Spring Boot 2.x 及以后版本),无论目标类是否实现接口。切换的核心在于控制 spring.aop.proxy-target-class 配置项,它决定了 Spring 选择哪种代理机制。
默认行为:CGLIB 是首选
Spring Boot 2.0+ 中该配置默认为 true,即强制启用 CGLIB。这意味着:
- 即使目标类实现了接口,也走 CGLIB(生成子类)
- 未实现接口的类只能用 CGLIB,此时不受该配置影响
- 代理对象的类名通常以
$$EnhancerBySpringCGLIB$$结尾
切换到 JDK 动态代理
在 application.properties 或 application.yml 中显式设置:
spring.aop.proxy-target-class=false
生效后:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 仅当目标类至少实现一个接口时,才使用 JDK 动态代理(生成
com.sun.proxy.$ProxyXX类) - 未实现接口的类仍会回退到 CGLIB(JDK 无法代理类)
- 若项目中大量使用接口,此设置可避免 CGLIB 的字节码操作开销
通过 @EnableAspectJAutoProxy 注解控制(Java 配置方式)
在配置类上添加注解,效果等同于配置文件设置:
@EnableAspectJAutoProxy(proxyTargetClass = false)
其中:
-
proxyTargetClass = true→ 强制 CGLIB(默认) -
proxyTargetClass = false→ 优先 JDK,不满足则降级 CGLIB
注意事项
切换不是“二选一”的全局开关,而是策略性选择:
- JDK 代理要求目标类必须有接口,且只能代理接口方法;final 方法无法被 CGLIB 覆盖,需避免声明为 final
- CGLIB 依赖字节码生成,需确保目标类非 final、方法非 final,否则代理失败
- 混合使用时(如部分 Bean 接口、部分无接口),两种代理可能共存,日志中可见不同类名前缀

















