Spring bean()切入点不适用于OR语句

问题描述 投票:1回答:1

我正在使用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语句有什么问题?

java spring aspectj
1个回答
1
投票

此切入点表达式无法按预期运行的原因是因为它不正确。 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());
}

希望这会有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.