Spring Boot 3.4.0升级后多切面失效问题求助
Spring Boot 3.4.0升级后多切面互斥失效问题排查思路
问题概述
将Spring Boot从3.3.0升级至3.4.0后出现切面互斥问题:
- 自定义
@OnError切面启用时,Micrometer的TimedAspect(对应类上的@Timed注解)失效,调试发现TimedAspect的切入点未匹配 - 在测试示例中,Micrometer的
TimedAspect与CountedAspect仅能有一个执行,无法同时生效 - 已尝试更新Micrometer至1.4.2、给自定义切面添加
@Order注解(调整优先级无效)
自定义切面切入点表达式:
@Around("execution(* de.hidden.service.api.controller..*.*(..)) && @annotation(de.hidden.service.api.util.aspects.errorshandling.OnError)")
排查方向
- 检查AOP代理模式变更
Spring Boot 3.4.x(对应Spring Framework 6.1.x)可能调整了默认代理策略。通过设置spring.aop.proxy-target-class=true或false,分别测试CGLIB和JDK动态代理模式,看是否能恢复多切面同时生效。 - 验证切入点表达式兼容性
简化自定义切面的切入点(比如先仅保留@annotation(de.hidden.service.api.util.aspects.errorshandling.OnError)),测试是否能与Micrometer切面共存,再逐步还原表达式定位问题点;同时检查Spring Framework 6.1.x对AspectJ切入点语法的调整。 - 手动指定切面优先级与注册方式
尝试手动注册Micrometer的TimedAspect/CountedAspectBean,并为所有切面设置明确的@Order值(比如让Micrometer切面优先级高于自定义切面,或反之),观察是否解决互斥问题。 - 检查代理对象的切面链
通过Advised接口打印代理对象的所有切面,确认Micrometer切面是否被正确加载到切面链中:if (yourControllerInstance instanceof Advised advised) { for (Advisor advisor : advised.getAdvisors()) { System.out.println("Registered advisor: " + advisor.getAdvice().getClass().getName()); } } - 对比Spring版本变更日志
查看Spring Framework 6.1.x和Spring Boot 3.4.0的官方变更文档,重点关注AOP代理创建、切面匹配逻辑的相关改动,确认是否有影响多切面执行的更新。 - 测试示例中添加切面执行日志
在测试示例的所有切面的环绕方法中添加日志输出,明确每个切面的切入点匹配结果、执行时机,判断是切入点未匹配还是切面未被加入执行链。
内容的提问来源于stack exchange,提问作者user5163331
相关产品推荐
相关产品推荐

