为什么现在 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 作为默认选项。

相关推荐
悟能不能悟1 分钟前
jdk25结构化并发和虚拟线程如何配合使用?有什么最佳实践?
java·开发语言
柠檬071111 分钟前
MATLAB相机标定入门:Camera Calibration工具包详解
开发语言·数码相机·matlab
卓码软件测评20 分钟前
借助大语言模型实现高效测试迁移:Airbnb的大规模实践
开发语言·前端·javascript·人工智能·语言模型·自然语言处理
熙客25 分钟前
Java8:Lambda表达式
java·开发语言
小咕聊编程29 分钟前
【含文档+PPT+源码】基于java web的篮球馆管理系统系统的设计与实现
java·开发语言
后端小张43 分钟前
【JAVA 进阶】Mybatis-Plus 实战使用与最佳实践
java·spring boot·spring·spring cloud·tomcat·mybatis·mybatis plus
崎岖Qiu1 小时前
【设计模式笔记07】:迪米特法则
java·笔记·设计模式·迪米特法则
我狸才不是赔钱货2 小时前
Python的“环境之殇”:从Venv到Conda的终极抉择
开发语言·python·conda
努力进修2 小时前
Rust 语言入门基础教程:从环境搭建到 Cargo 工具链
开发语言·后端·rust
摇滚侠3 小时前
Spring Boot3零基础教程,SpringApplication 自定义 banner,笔记54
java·spring boot·笔记