Spring Boot整合AspectJ编译时织入调用aspectOf()报NoSuchMethodException求助
错误根本原因
你遇到的NoAspectBoundException伴生NoSuchMethodException: xxx.aspectOf()报错,核心原因是AspectJ编译时织入没有正常执行。aspectOf()是AspectJ编译器在编译切面类时自动注入的静态方法,没有这个方法说明你的LoggingInterceptorAspect类没有被AspectJ编译器正确处理。
排查与解决步骤
1. 切面类实例化逻辑修正
你当前的切面类用了带参构造方法加@Autowired注入依赖,而AspectJ默认的切面是单例,且编译时织入的切面实例默认不由Spring直接创建,写法存在冲突:
给LoggingInterceptorAspect类添加@Configurable、@Component注解,去掉自定义的带参构造,改为字段注入或者setter注入,让Spring可以管理AspectJ实例的依赖注入:
@Aspect @Configurable @Component public class LoggingInterceptorAspect { @Autowired private LoggingService loggingService; // 保留无参构造 // 原有切点、通知逻辑不变 }
同时在Spring Boot启动类上添加@EnableSpringConfigured注解开启对@Configurable的支持。
2. 确认编译触发逻辑
如果用IDEA等IDE开发,需要确认构建策略委托给Maven执行,不要用IDE自带的javac编译器,否则不会触发AspectJ织入:
IDEA路径:设置>构建,执行,部署>构建工具>Maven>运行器,勾选将IDE构建/运行操作委托给Maven。
3. AspectJ Maven插件配置补全
如果你的切面类放在src/main/java目录下(不是默认的src/main/aspect目录),需要在插件配置里显式指定切面源码目录:
<plugin> <groupId>com.nickwongdev</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.12.6</version> <configuration> <!-- 原有配置保留 --> <aspectDirectory>src/main/java</aspectDirectory> </configuration> <!-- 原有executions配置保留 --> </plugin>
4. 依赖版本冲突修复
Spring Boot 2.5.3自带的AspectJ版本为1.9.7,你手动指定了1.9.5版本存在不兼容风险,直接去掉aspectjweaver和aspectjrt的手动版本号即可,由Spring Boot父依赖统一管理版本。
内容的提问来源于stack exchange,提问作者skyho

