我正在使用称为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语句有什么问题?
问题来源:Stack Overflow
该切入点表达式无法按预期运行的原因是因为它不正确。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 Bean名称中的方法执行。
@AfterReturning("bean(*Service)")
public void logMethodCall(JoinPoint jp) {
System.out.println(jp.getSignature());
}
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。