20

假设我有这样的方法:

public void method(@CustomAnnotation("value") String argument)

是否有一个切入点表达式可以选择所有带有@CustomAnnotation 注释的参数的方法?如果是这样,有没有办法可以访问“价值”参数?

4

5 回答 5

25

在选择你的论点时:

@Before("execution(* *(@CustomAnnotation (*)))")
public void advice() {
System.out.println("hello");
}

参考:http: //forum.springsource.org/archive/index.php/t-61308.html

在获取注释参数时:

MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
Annotation[][] methodAnnotations = method.getParameterAnnotations();

将为您提供可以迭代的注释并使用 instanceof 来查找绑定的注释。我知道那很hacky,但afaik这是目前唯一支持的方式。

于 2012-04-24T11:07:04.520 回答
10

匹配1..N注释参数,不管它们的位置使用

编辑 2020-12-3:@sgflt 的简化版本

@Before("execution(* *(.., @CustomAnnotation (*), ..))")
public void advice(int arg1, @CustomAnnotation("val") Object arg2) { ... }
于 2018-10-19T09:32:58.717 回答
7

只是为了完成最后一个答案:

@Before(value="execution(* *(@CustomAnnotation (*), ..)) && args(input, ..)")
public void inspect(JoinPoint jp, Object input) {
        LOGGER.info(">>> inspecting "+input+" on "+jp.getTarget()+", "+jp.getSignature());
}

将匹配一个方法,其中(一个)方法的参数用注释 @CustomAnnotation,例如:

service.doJob(@CustomAnnotation Pojo arg0, String arg1);

相比之下

@Before(value="execution(* *(@CustomAnnotation *, ..)) && args(input, ..)")
public void inspect(JoinPoint jp, Object input) {
            LOGGER.info(">>> inspecting "+input+" on "+jp.getTarget()+", "+jp.getSignature());
    }

这将匹配参数的类 (之一)用 注释的方法@CustomAnnotation,例如:

service.doJob(AnnotatedPojo arg0, String arg1);

pojo声明如下:

@CustomAnnotation
public class AnnotatedPojo {
}

所有的区别都在于切入点声明中的@CustomAnnotation (*)vs .。@CustomAnnotation *

于 2018-07-10T14:08:39.097 回答
1

如果您在方法中有多个参数,您还应该使用两个点来计算任意数量的参数(零个或多个)

@Before("execution(* *(@CustomAnnotation (*), ..))")
public void advice() {
    System.out.println("hello");
}
于 2018-02-14T17:16:37.857 回答
-1

来自 Spring 文档:

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

这对我来说效果很好,无需操作方法签名。

注意:如果您使用命名切入点,因为切入点名称可能被重载,您必须提供匹配的(参数名称和顺序)签名。

@Before("goodAdvise(myAnnotation)")
public void audit(Auditable myAnnotation) {
  String value = auditable.value();
  // ...
}

@Pointcut("@annotation(myAnnotation)")
public void goodAdvise(Auditable myAnnotation) { 
  //empty
}
于 2013-03-12T14:15:06.503 回答