切入点表达式中两个连续的星号是什么意思?

What does two consecutive asterisks in Pointcut expression mean?

我试图定义一个切入点来匹配 class 中的所有方法,但它没有用。 我努力寻找原因。 而我最终找到了我定义的切入点表达式的错误点。

下面是我先定义的开始。 (不起作用)

@Pointcut("execution(** membership.data.MemberRepository.*(..))")

正如我所知,"execution(**" 中连续的两个星号表示任何访问修饰符和任何 return 类型,但它从未匹配某些具有某种 return 类型的方法像这样:

public List<MemberVO> findByName(String name) { ...

另一方面,它匹配了另一个这样的:

public String print(String str) { ...

以下是我发现的正确定义它的方法的开始。这些与上面的两个方法签名匹配并且工作正常。

@Pointcut("execution(public * membership.data.MemberRepository.*(..))")

@Pointcut("execution(* membership.data.MemberRepository.*(..))")

我错过了什么?我努力寻找答案,但它从未出现过。 请让我知道 "execution(** ".

的确切含义

添加:方面的完整来源class

@Aspect
public class PerformanceLogger {

    @Pointcut("execution(* membership.data.MemberRepository.*(..))")
    public void performance() {}

    @Around("performance()")
    public Object watchPerformance(ProceedingJoinPoint jp) {
        try {
            long st = System.nanoTime();
            Object obj = jp.proceed();
            System.out.println(jp.toShortString() + " called :" + (System.nanoTime() - st));
            return obj;
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
    }
}

正如我在评论中所说:** 没有任何意义,您很幸运,解析器似乎将其解释为等同于 *,但您不能确定。实际上它应该产生一个语法错误。所以请不要使用它,它是没有意义的。您对含义的假设是错误的。 * * blah(..) 也不起作用,它是无效语法。 IMO 它应该在书 "Spring in Action" 中得到修复,我也在那里找到了它。在整个 AspectJ 文档中,您不会找到类似 **.

的内容

至于你的问题:为了获得 class membership.data.MemberRepository 的所有方法执行,你使用切入点 execution(* membership.data.MemberRepository.*(..))。你自己已经发现了。