首页 > 解决方案 > 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 语句有什么问题?

标签: javaspringaspectj

解决方案


这个切点表达式不能按预期工作的原因是它不正确。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());
}

希望这可以帮助


推荐阅读