开发者社区> 问答> 正文

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语句有什么问题?

问题来源:Stack Overflow

展开
收起
montos 2020-03-22 14:33:40 676 0
1 条回答
写回答
取消 提交回答
  • 该切入点表达式无法按预期运行的原因是因为它不正确。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

    2020-03-22 14:35:19
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多