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

时间:2017-03-14 02:22:24

标签: java aop aspectj

我尝试定义一个与一个类中的所有方法匹配的切入点,但它不起作用。 我努力找出原因。 我最终找到了我定义的切入点表达式的错误点。

以下是我首先定义的开头。 (不起作用)

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

正如我所知,“执行中的连续两个星号(**”表示任何访问修饰符和任何返回类型,但它从未匹配某些具有某种类型的返回类型的方法:

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

另一方面,它与另一个匹配:

public String print(String str) { ...

以下是我发现的定义它的正确方法的开始。这些符合上述两种方法签名并且工作正常。

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

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

我错过了什么?我努力寻找答案,但从未出现过。 请让我知道“执行(**”。

的确切含义

添加:方面类的完整来源

@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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

的内容

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