在Spring in Action一书中,我发现了以下AspectJ切点表达式:
@Pointcut("execution(** concert.Performance.perform(..))")
void performance();
这将指定切入点性能以包含名称为“perform”且返回类型可以为any的方法。但请注意,它使用两颗星(**)来匹配返回类型,正如我已经尝试过的,一颗星(*)可以完美地完成这项工作,这意味着以下行可以做同样的事情:
@Pointcut("execution(* concert.Performance.perform(..))")
void performance();
我注意到许多AspectJ演示使用两颗星(**)来匹配“任何返回类型”,所以有什么理由这样做吗?使用一颗星匹配“任何返回类型”有什么问题?
答案 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
方法接受任何类型的参数,方法可能有任何返回类型(使用可选的访问修饰符意味着访问修饰符可以是任何东西)。