我最近将 Spring Boot 从 3.3.0 升级到 3.4.0,我的一个方面停止了工作。
我的自定义注释名为
@OnError(clazz =...)
添加在方法级别,并具有针对它的方面切入点:
@Around("execution(* de.hidden.service.api.controller..*.*(..)) && @annotation(de.hidden.service.api.util.aspects.errorshandling.OnError)")
我还使用 Micrometer 中与
@Timed
相关的
TimedAspect
注释。我在类级别使用此注释。
使用 Spring Boot 3.3.0,这两方面都工作得很好。自 3.4.0 起,当使用针对我的
TimedAspect
的方面时,@OnError
停止工作。
1.4.2
。@Order
(非常高或非常低,没有效果)。TimedAspect
时,切入点似乎不匹配 - 它不会停止在方法的第一行。如果有人提供线索那就太好了。
更新:我在这里添加了MCVE:https://github.com/mzander/spring-boot-3.4.0-aop-MCVE 我使用了 Micrometer 的
TimedAspect
和 CountedAspect
。同样的问题 - 如果执行的话只有一个问题。在此示例中,执行了 TimedAspect
,但不执行 CountedAspect
。
这对于评论来说太长了,所以我正在写一个初步答案。
我玩了你的 MCVE 项目,发现破坏你的情况的行为是从依赖关系
io.micrometer:micrometer-core:1.13.9
切换到 1.14.0
或以上。所有其他 Micrometer 依赖项都可以是 1.14.2
,它仍然有效。您看到它在 Boot 3.4.0 中中断的原因是您的依赖项管理仅考虑 micrometer-registry-prometheus
,而不考虑其他自动导入为传递依赖项。如果您手动执行类似的操作,它将在 Boot 3.4.0 中继续工作:
implementation("io.micrometer:micrometer-registry-prometheus:1.14.2")
implementation("io.micrometer:micrometer-core:1.13.9")
implementation("io.micrometer:micrometer-observation:1.14.2")
implementation("io.micrometer:micrometer-jakarta9:1.14.2")
implementation("io.micrometer:micrometer-commons:1.14.2")
一旦切换到
micrometer-core:1.14.0
或更高,计时和计数方面就不再按预期运行。这可能是 Micrometer 问题 #1149 的副作用,该问题已在 1.14.0 中解决,并且我对此做出了一些贡献,尽管最终的提交与我的想法有点不同。我还没有详细调试过它,但也许你想和 Micrometer 的人谈谈。我不是 Micrometer 用户,只是 AOP 专家。
实际上,我不确定您想要通过编译后编织实现什么以及为什么您认为需要它。你没有解释,你的MCVE也没有说清楚。根据您的答案,也许您需要以不同的方式配置 Freefair 插件,因为一方面您似乎希望使用 Micrometer 和自定义方面作为 Spring 组件,另一方面您似乎认为出于某种原因需要本机 AspectJ 。您需要小心,不要以错误的方式混淆它们。