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

SpringAOP切面执行两次问题排查求助(附代码)

问题根源与解决方案

兄弟,你这切面执行两次的问题根源太明显了——你同时用了两种Spring AOP的配置方式,导致同一个切面被重复注册了两次!

具体原因分析

你已经在CustodianMetricsAspect类上标注了@Aspect和@Component注解,同时又在Spring XML里通过<aop:config>块手动声明了这个切面。Spring会同时处理这两种配置逻辑:

  1. 通过@Aspect + <aop:aspectj-autoproxy>扫描并注册一次切面
  2. 通过<aop:config>里的<aop:aspect>标签再次注册同一个切面实例

这就导致每次触发目标方法时,两个重复的切面都会执行,自然就出现了两次调用的问题。你之前修改切点表达式的操作完全没触及核心问题,所以才会无效。


解决方案(二选一即可)

选项1:保留注解驱动的AOP(推荐)

这种方式更简洁,符合Spring注解化的趋势:

  1. 删掉XML里的整个<aop:config>块
  2. 修正<aop:aspectj-autoproxy>里的include规则(你原来写的name="path"明显不对,应该指定切面bean的名称custodianMetricsAspect)

修改后的XML配置如下:

<aop:aspectj-autoproxy>
    <aop:include name="custodianMetricsAspect"/>
</aop:aspectj-autoproxy>
  1. 确保切面类上的@Aspect和@Component("custodianMetricsAspect")注解保留不动,Spring会自动扫描并注册这个切面。

选项2:使用纯XML配置的AOP

如果你更倾向于XML配置风格:

  1. 去掉切面类上的@Aspect注解(保留@Component或者在XML里显式声明这个bean)
  2. 删掉XML里的<aop:aspectj-autoproxy>块
  3. 保留原有的<aop:config>配置即可

验证方法

重启应用后,调用带有@CustodianMetrics注解的目标方法,观察metric.inc()的执行次数,应该只会触发一次了。

内容的提问来源于stack exchange,提问作者Anton Ivanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:15:12