Spring 中@Pointcut 注解中的通配符

问题描述 投票:0回答:1

是否可以使用注释通配符定义方法切入点表达式?

例如“匹配所有以‘Has’开头的注释”

尝试过:

@Pointcut("execution(@Has.* * *(*))")
@Pointcut("execution(@Has..* * *(*))")

但这不起作用。

@Pointcut("execution(@HasSpecificAnnoation * *(*))")
适用于一个特定的扩展。但这不是我需要的东西...

java spring annotations pointcut
1个回答
0
投票

您的切入点存在多个潜在问题:

  1. 表达式

    *(*)
    仅匹配仅具有一个参数的方法。最好使用
    *(..)
    来匹配任意数量的参数。

  2. 表达式

    @Has.*
    与名为
    Has
    的包中的任何注释匹配,因为
    .
    是包或内部类分隔符。这不是你想要的。

  3. 表达式

    @Has..*
    与名为
    Has
    的包或其任何子包中的任何注释匹配,因为
    ..
    双点表达式旨在专门包含子包。这也不是你想要的。

您可能想要的是匹配任何包中任何注释所注释的方法,其名称以

Has
开头。正确的语法是

execution(@*..Has* * *(..))

其中

*..
匹配所有包,
Has*
匹配注释类型名称的开头。

顺便说一句,如果您还想匹配类型上的这些注释而不仅仅是方法上的注释,则需要按如下方式修改切入点(请注意注释类型名称周围的括号:

execution(@*..Has* * *(..))           // match annotated methods, same as above
  || execution(* (@*..Has* *).*(..))  // match annotated types
© www.soinside.com 2019 - 2024. All rights reserved.