java - Spring bean() 切入点不适用于 OR 语句
问题描述
我正在使用称为 bean() 的 Spring 特定切入点表达式。对于以下表达式,仅捕获左侧部分:
@AfterReturning("bean(FirstService).firstMethod(..) || bean(SecondService).secondMethod(..)")
如果我倒车,左边的部分再次被抓住:
@AfterReturning("bean(SecondService).secondMethod(..) || bean(FirstService).firstMethod(..)")
如果我写:
@AfterReturning("bean(SecondService).secondMethod(..)")
并@AfterReturning("bean(FirstService).firstMethod(..)")
有两种方法
然后两者都有效。第一个 OR 语句有什么问题?
解决方案
这个切点表达式不能按预期工作的原因是它不正确。Spring 框架没有抛出任何异常,这是导致混乱的另一个原因。
根据 Spring 参考文档第5.4.3 节。声明一个切入点声明切入点指示符的正确方法bean()
如下
bean(idOrNameOfBean)
idOrNameOfBean 标记可以是任何 Spring bean 的名称。.
像以下代码这样的切面是定义切面的正确方法,这将拦截两个 bean 的所有方法调用。
@Component
@Aspect
public class BeanAdviceAspect {
@AfterReturning("bean(firstService) || bean(secondService)")
public void logMethodCall(JoinPoint jp) {
System.out.println(jp.getSignature());
}
}
切入点表达式bean(firstService).firstMethod()
不正确,框架似乎bean(firstService)
在
为了确认这种行为,以下方面
@Component
@Aspect
public class BeanAdviceAspect {
@AfterReturning("bean(firstService).firstMethod() || bean(secondService)")
public void logMethodCall(JoinPoint jp) {
System.out.println(jp.getSignature());
}
}
firstService.thirdMethod()
出于上述原因,还将建议一种方法。
另一种声明bean
切入点指示符的方法如下。这匹配任何与通配符表达式匹配的 Spring beans 名称中的方法执行。
@AfterReturning("bean(*Service)")
public void logMethodCall(JoinPoint jp) {
System.out.println(jp.getSignature());
}
希望这可以帮助
推荐阅读
- function - 类型的表达式
- c++ - c++分配器在内存不足时使应用程序崩溃
- vue.js - 将对象传递给组件
- c# - 无法在 .NET Core 2.2 和 Identity Server 4 下进行身份验证
- javascript - Vue 和 Stripe 导致 Invalid Dom Element 错误。但是dom元素被正确渲染了
- vb6 - 为什么 VB6 对对象大小属性进行微不足道的更改?
- javascript - 为什么在创建带有参数的任务时出现“任务不在您的 gulpfile 中”?
- protractor - 量角器 - 使用模态上传文档
- python - 在 MultiIndex 的情况下,每个索引的列总和
- c# - 如何使用 linq c# 或内部泛型方法为任何一个或两个 prop 赋值?