You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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/CountedAspect Bean,并为所有切面设置明确的@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:30:06