我正在使用Spring特定的切入点表达式,称为bean()。对于以下表达式,仅左侧部分被捕获:
@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. Declaring a Pointcut节,声明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 Bean名称中的方法执行相匹配。
@AfterReturning("bean(*Service)")
public void logMethodCall(JoinPoint jp) {
System.out.println(jp.getSignature());
}
希望这会有所帮助