为什么现在 Spring Boot 默认使用 CGLIB 了?

从 Spring Boot 2.0 开始,默认的代理方式被改为了 CGLIB (spring.aop.proxy-target-class=true)。

这是因为 CGLIB 解决了一个使用 JDK 代理时非常棘手的痛点:代理对象内部方法调用无法触发 AOP 的问题。

  • 场景:假设你有一个 UserServiceImpl 对象被 JDK 代理了。你在它的 methodA() 方法内部调用了同一个类中的 methodB() 方法(通过 this.methodB())。
  • 问题:这个 methodB() 的调用不会被 AOP 拦截!因为 this 指向的是原始的 UserServiceImpl 对象,而不是代理对象。这次调用是从对象内部发起的,绕过了代理。
  • CGLIB 的优势:使用 CGLIB 时,代理对象是原始对象的子类。在子类实例中,this 指向的就是代理对象本身。因此,内部调用 this.methodB() 依然是通过代理发起的,AOP 能够正常生效。

为了解决这种令人困惑的场景,提供更一致、更可预测的行为,Spring Boot 最终决定拥抱 CGLIB 作为默认选项。

相关推荐
冷雨夜中漫步6 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
JH30737 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
m0_736919108 小时前
C++代码风格检查工具
开发语言·c++·算法
Coder_Boy_8 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_944934738 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy8 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
invicinble8 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟8 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖8 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_763472469 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法