Spring Boot从3.2.x升级到3.3.x触发AspectJ NoSuchMethodException问题
核心问题定位
升级Spring Boot到3.3.5后启动失败,抛出NoSuchMethodException: ...aspectOf(),本质是Spring尝试以原生AspectJ方式初始化切面类,但该类未被AspectJ织入处理——aspectOf()是AspectJ织入时自动生成的方法,用于获取单例切面实例。
尽管两个版本的aspectj.version一致,但Spring Boot 3.3.x(对应Spring Framework 6.1.x)对AOP组件的初始化逻辑做了调整,导致原有手动注册切面的方式不再兼容。
具体解决步骤
1. 修正切面的注册方式
你的项目中通过@Bean手动创建LogAspect实例,这会触发Spring尝试用原生AspectJ逻辑初始化切面,但如果没有配置编译时织入(CTW),就会缺少生成的aspectOf()方法。
修改方案:
- 移除
AspectConfig中的@Bean方法,改为让LogAspect通过组件扫描自动注册:// AspectConfig.java @Configuration @EnableAspectJAutoProxy // 启用Spring AOP动态代理 public class AspectConfig { // 移除logAspect()的@Bean方法 } - 给
LogAspect添加@Component注解,确保Spring能扫描到该类:// LogAspect.java @Aspect @Component public class LogAspect { // 原切面逻辑保留 }
2. 检查AspectJ织入配置(如果使用编译时织入)
如果项目依赖AspectJ编译时织入(而非Spring AOP动态代理),需确保aspectj-maven-plugin配置正确,且绑定到编译阶段:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.14.0</version> <!-- 与AspectJ 1.9.22.1兼容的版本 --> <executions> <execution> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>${aspectj.version}</version> </dependency> </dependencies> </plugin>
3. 排查依赖冲突
执行mvn dependency:tree检查是否有第三方依赖引入了不同版本的AspectJ组件,确保所有AspectJ相关依赖(aspectjrt、aspectjweaver等)都使用统一的1.9.22.1版本。
4. 修复测试类问题
测试失败通常是因为AOP配置未正确加载,确保测试类添加@SpringBootTest,且能扫描到AspectConfig和LogAspect所在的包。如果需要,可在测试类上显式添加@EnableAspectJAutoProxy。
关键原理补充
Spring AOP默认使用动态代理(JDK或CGLIB),不需要AspectJ织入;只有当你手动注册切面实例且Spring检测到@Aspect注解时,才会尝试切换到原生AspectJ逻辑,此时必须确保切面类已被织入处理。Spring Boot 3.3.x强化了这种逻辑的校验,导致原有兼容写法失效。
内容的提问来源于stack exchange,提问作者Nitin Kumar

