SpringAOP切面执行两次问题排查求助(附代码)
问题根源与解决方案
兄弟,你这切面执行两次的问题根源太明显了——你同时用了两种Spring AOP的配置方式,导致同一个切面被重复注册了两次!
具体原因分析
你已经在CustodianMetricsAspect类上标注了@Aspect和@Component注解,同时又在Spring XML里通过<aop:config>块手动声明了这个切面。Spring会同时处理这两种配置逻辑:
- 通过
@Aspect+<aop:aspectj-autoproxy>扫描并注册一次切面 - 通过
<aop:config>里的<aop:aspect>标签再次注册同一个切面实例
这就导致每次触发目标方法时,两个重复的切面都会执行,自然就出现了两次调用的问题。你之前修改切点表达式的操作完全没触及核心问题,所以才会无效。
解决方案(二选一即可)
选项1:保留注解驱动的AOP(推荐)
这种方式更简洁,符合Spring注解化的趋势:
- 删掉XML里的整个
<aop:config>块 - 修正
<aop:aspectj-autoproxy>里的include规则(你原来写的name="path"明显不对,应该指定切面bean的名称custodianMetricsAspect)
修改后的XML配置如下:
<aop:aspectj-autoproxy> <aop:include name="custodianMetricsAspect"/> </aop:aspectj-autoproxy>
- 确保切面类上的
@Aspect和@Component("custodianMetricsAspect")注解保留不动,Spring会自动扫描并注册这个切面。
选项2:使用纯XML配置的AOP
如果你更倾向于XML配置风格:
- 去掉切面类上的
@Aspect注解(保留@Component或者在XML里显式声明这个bean) - 删掉XML里的
<aop:aspectj-autoproxy>块 - 保留原有的
<aop:config>配置即可
验证方法
重启应用后,调用带有@CustodianMetrics注解的目标方法,观察metric.inc()的执行次数,应该只会触发一次了。
内容的提问来源于stack exchange,提问作者Anton Ivanov
相关产品推荐
相关产品推荐

