spring AspectJ如何将@annotation通知表达式与注解匹配,即使表达式的大小写不同(小大小写)?

nnvyjq4y  于 2023-09-29  发布在  Spring
关注(0)|答案(1)|浏览(131)
@Auditable(value=1)
public ResponseEntity upload(@RequestParam file){
    // Code
}

这段代码使用了下面给出的@Auditable注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Auditable {
    Integer value() default 0;
}

我有一个方面如下

@Before("@annotation(auditable)")
public void audit(Integer auditable) {
  AuditCode code = auditable;
  // ...
}

在上面的例子中,即使@Auditable中的A字母是大写的,而@annotation(auditable)中的A字母是小写的,@Auditable表达式是如何与@annotation(auditable)表达式匹配的?
我试着阅读文档,但它只是给出了事实,而没有解释注解表达式匹配的边界以及在什么情况下会失败。我希望注解匹配是大小写敏感的,但我认为更深层次的事情正在发生,比如@Auditable注解的对象创建,然后该对象以某种方式与Aspect匹配。

juzqafwq

juzqafwq1#

Spring AOP或AspectJ中的注解是按其类型匹配的。语法

  • @annotation(my.package.MyAnnotation)
  • 或者@annotation(myAnnotationParameter)与像MyAnnotation myAnnotationParameter这样的建议参数组合,例如,
@Before("@annotation(auditable)")
public void audit(Auditable auditable) {
  System.out.println(auditable.value());
  // ...
}

或者,如果你需要连接点,

@Before("@annotation(auditable)")
public void audit(JoinPoint joinPoint, Auditable auditable) {
  System.out.println(joinPoint + " -> " + auditable.value());
  // ...
}

如果注解参数像这样绑定到建议参数,那么它在建议方法签名和切入点中的名称应该完全匹配,即以区分大小写方式。
但是你的例子没有任何意义,我怀疑你在任何类似的教程中找到了它:

@Before("@annotation(auditable)")
public void audit(Integer auditable) { // ⚡
  AuditCode code = auditable;          // ⚡
  // ...
}

这将不匹配,因为Integer不是注解类型。它甚至不能编译,因为你不能把Integer赋值给AuditCode的任何类型--除非AuditCode恰好是Integer的子类,这是不可能的,因为Integer是一个final类。
下一次,请不要发布你直接在Stack Overflow上编写的未经测试的伪代码,而是你实际编译并在本地机器上运行的代码。

相关问题