如何在一个切入点表达式中匹配两种模式

问题描述

我想定义切入点以匹配两种方法

  1. org.mypackage.Foo中所有名称以“ update”开头的方法
  2. 同一类中所有名称以“ delete”开头的方法

我尝试了以下操作:

@Before("execution (* org.mypackage.Foo.update*(..) ) && execution(* org.mypackage.Foo.delete*(..) )")
public void verify()
{
  //verify if user has permission to modify...
}

它不起作用。当我调用Foo.update *()方法或Foo.delete *()方法时,不会调用verify()。

我应该如何更改?

解决方法

有2个选项可以匹配切入点表达式中的模式。切入点表达式可以是对命名切入点的简单引用,也可以是就地声明的切入点表达式。

  1. 通过为各个切点创建单独的方法。并使用该方法名称作为@Before建议中的参考。
    @Pointcut("execution(* org.mypackage.Foo.update*(..))")
    private void fooUpdate() {}
    
    @Pointcut("execution(* org.mypackage.Foo.delete*(..))")
    private void fooDelete() {}
    
    @Before("fooUpdate() || fooDelete()")
    public void verify() {
      // verify if user has permission to modify...
    }
  1. 直接在适当位置声明切入点表达式。
    @Before("execution(* org.mypackage.Foo.update*(..)) || execution(* org.mypackage.Foo.delete*(..))")
    public void verify() {
      // verify if user has permission to modify...
    }
,

在表达式中将&&更改为||