为什么在切点表达式中使用两个星来匹配 return 类型?

Why use two stars in point cut expression to match return type?

在书 Spring in Action 中,我发现以下 AspectJ 点切表达式:

@Pointcut("execution(** concert.Performance.perform(..))")
void performance();

这将指定切点 性能 以包括名称为 "perform" 且 return 类型可以是任意的方法。但请注意它使用两颗星 (**) 来匹配 return 类型,正如我所试验的那样,一颗星 (*) 可以完美地完成这项工作,这意味着以下行可以做同样的事情:

 @Pointcut("execution(* concert.Performance.perform(..))")
 void performance();

而且我注意到许多 AspectJ 演示使用两个星号 (**) 来匹配 "any return type",那么这样做有什么理由吗?用一颗星匹配"any return type"有什么问题?

Spring documentation 有助于更好地理解这一点。它说

Spring AOP users are likely to use the execution pointcut designator the most often. The format of an execution expression is:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)

第一部分 modifiers-pattern 是可选的,因为您可以看到它带有 ? 后缀。这是指定方法的访问类型。

因此,在您的情况下,切入点表达式 execution(** concert.Performance.perform(..)) 建议使用任何访问修饰符和任何 return 类型的方法执行方法名称 perform 的类型 concert.Performance有任何参数类型。

execution(* concert.Performance.perform(..)) 意思相同,其中第一个 * 是可选的,表示 concert.Performance 类型的 perform 方法接受任何类型的参数,并且方法可以有任何return 类型(带有可选的访问修饰符意味着访问修饰符可以是任何东西)。