当前位置: 首页 > 知识库问答 >
问题:

Spring AOP:如何排除由于其他@pointcuts/advices执行而导致的不必要的@pointcut(@around advice)执行

商焕
2023-03-14
    null
  • @控制器->@服务->@repository

关于AOP,我有以下一对:

  • PersonaservicePointcut
    • Personaserviceaspect

    实际上,对save方法应用了相同的方法。因此,在执行save方法之前,将执行其他@before@around建议,再次调用FindoNebyID方法。如果实体已经存在,则必须抛出异常,比如异常B,它必须在@ControllerAdvise中处理

    请注意,我有3点/3advices使用FindoNebyID方法。它用来检查实体是否存在。

    例如:

        @Pointcut(value=
        "execution(* mypackage.PersonaServiceImpl.saveOne(otherpackage.Persona)) 
        && args(persona)")
        public void saveOnePointcut(Persona persona){}
    
        @Pointcut(value=
        "execution(*  
        mypackage.PersonaServiceImpl.updateOne(otherpackage.Persona)) 
        && args(persona)")
        public void updateOnePointcut(Persona persona){}
    
        @Pointcut(value="execution(*  
        mypackage.PersonaServiceImpl.deleteOne(String)) && args(id)")
        public void deleteOnePointcut(String id){}
    
    @Pointcut(value="execution(*    
    mypackage.PersonaServiceImpl.findOneById(String)) 
    && args(id)")
    public void findOneByIdPointcut(String id){}
    

    我需要更改pointcut声明以指示如下内容:

    @Pointcut(Alpha)
    public void findOneByIdPointcut(String id){}
    

    其中alpha为:

    @serviceFindoNebyID方法执行before/around建议,但如果它的调用是从
    PersonaserviceAspect类的其他建议执行的,则永远不要执行。

    @Around("PersonaServicePointcut.anyMethodPointcut()")
        public Object aroundAdviceAnyMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
    

    有可能实现这种方法吗?怎么做?

    谢了。

共有1个答案

窦宏旷
2023-03-14

可以用

!cflow(<pointcut>)

在您的示例中,您希望排除FindoNebyID的那些执行,其中的执行位于您自己的通知的控制流中。如果建议应用于切入点表达式

@Pointcut("saveOnePointcut() || updateOnePointcut() || deleteOnePointcut()")
public void combinedPointcut() {}

可以通过以下方法排除:

!cflow(combinedPointcut())
!cflow(adviceexecution())
@Around("findOneByIdPointcut() && !cflow(combinedPointcut())")
public void aroundFind() {
    ....
}
 类似资料:
  • 我正在编写一个脚本,将MKV或AVI等视频文件转换成MP4,然后从web流媒体中准备它们。我希望我的输出使用H.264和AAC编解码器。 到目前为止,我的命令如下所示: 然而,当编解码器已经是H.264时,它仍然对其进行多路复用,它表示:(H264->libx264)。 如果我将'-vcodec h264'替换为'-vcodec copy',当编解码器是H.264时,它的速度会快得多,但如果输入文

  • 实现SortedSet的Java类除了提供一些其他方法外,还应该提供一个迭代器,以升序迭代其元素。但我认为SortedSet接口规范无法强制执行它指定的这种行为约束。SortedSet只有几个方法,一个实现类可以实现这些方法,而实际上不必满足返回升序迭代器的要求,或者确实不需要有一个有效的比较器。 仅仅查看接口方法而不知道其名称,并不能告诉开发人员实现类应该实现的核心行为。 实现开发人员应该阅读J

  • 我有一个关于智力的Java项目,本学期有多个练习要做。一些测试与这些练习有关。但是,由于生成失败,我无法运行测试,因为某些方法尚未在其他文件中实现。 例如,我有一个StackWithTwoQueues。我实现并关联的java文件,我有StackWithTwoQueuesTest。java文件。当我运行这个文件时,我得到“build failed”,因为文件MinMaxHeap中的一些方法。java

  • 我计划使用Spring Batch。我们喜欢在响应前端请求的POD中启动新作业执行。 伪代码: 但我们不希望作业在前端pod中执行。为此,我们希望构建一个单独的微服务吊舱。 我看到了以下解决方案: > 从前端pod到sping-batpod执行一个rest调用并在那里开始工作。我可以这样做,但如果可能的话,我想跳过该步骤并将其集成到sping-batdb上。 在前端pod中,我创建了具有大小为零的

  • 我得到了 我错过了什么?

  • 问题内容: 我有一个使用外部jar的应用程序。我使用了eclipse,效果很好。我从eclipse导出为jar,创建了一个清单文件,该文件具有Class- Path:./cab.v1.jar,我将两个jar都放在了同一目录中。我在命令行中运行:java -jar myApp.jar 并为cab.v1.jar(另一个jar)中的类获取 java.lang.NoClassDefFoundError 也