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

时间:2016-04-19 11:51:41

标签: spring aop spring-aop

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

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

这将指定切入点性能以包含名称为“perform”且返回类型可以为any的方法。但请注意,它使用两颗星(**)来匹配返回类型,正如我已经尝试过的,一颗星(*)可以完美地完成这项工作,这意味着以下行可以做同样的事情:

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

我注意到许多AspectJ演示使用两颗星(**)来匹配“任何返回类型”,所以有什么理由这样做吗?使用一颗星匹配“任何返回类型”有什么问题?

1 个答案:

答案 0 :(得分:7)

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

  

Spring AOP用户可能最常使用执行切入点指示符。执行表达式的格式为:

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

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

因此,在您的情况下,切入点表达式execution(** concert.Performance.perform(..))建议使用任何访问修饰符执行方法,并在类型concert.Performance上使用具有任何参数类型的方法名perform的任何返回类型。< / p>

execution(* concert.Performance.perform(..))表示第一个*是可选的,表示类型perform上的concert.Performance方法接受任何类型的参数,方法可能有任何返回类型(使用可选的访问修饰符意味着访问修饰符可以是任何东西)。