【问题标题】:Spring AOP: Getting parameters of the pointcut annotationSpring AOP:获取切入点注解的参数
【发布时间】:2011-07-14 00:37:22
【问题描述】:

考虑一下我已经定义了以下方面:

@Aspect
public class SampleAspect {

    @Around(value="@annotation(sample.SampleAnnotation)")
    public Object display(ProceedingJoinPoint joinPoint) throws Throwable {
        // ...
    }
}

和注释

public @interface SampleAnnotation {
    String value() default "defaultValue";
}

如果我的aspect有没有办法读取显示方法中注解SampleAnnotation的value参数?

感谢您的帮助, 埃里克

【问题讨论】:

标签: spring aop spring-aop


【解决方案1】:

将建议签名更改为

@Around(value="@annotation(sampleAnnotation)")
public Object display(ProceedingJoinPoint joinPoint, SampleAnnotation sampleAnnotation ) throws Throwable {
    // ...
}

您将可以访问注释中的值。

请参阅docs 了解更多信息。

【讨论】:

  • 查看详细文档:docs.spring.io/spring/docs/3.0.3.RELEASE/… - 第 7.2.4.6 节建议参数
  • 这里的细微差别是@Around 值必须包含一个参数名称,而不是注释的名称。在这个答案中,它们几乎是相同的(区别只是第一个字母的大小写),所以起初我很困惑为什么它在我的代码中不起作用,直到我注意到字母的大小写。
【解决方案2】:

下面我将添加一个完整的 AOP 实现示例,我将从我的 Custom pointCut 注释中获取参数,我的建议旨在计算函数的执行时间:

1- 自定义注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationLogExecutionTime {

    public boolean isActivate() default false;

}

2- 控制器:

@AnnotationLogExecutionTime(isActivate = true)
@PostMapping("/connection")
public HttpEntity<String> createAuthenticationToken(HttpServletRequest request,
                                                        @RequestBody AuthenticationRequest authenticationRequest) {...}

3- 建议

@Component
@Aspect
public class LoggingExecutionTimeAdvice {

    @Around("@annotation(annotationLogExecutionTime)")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint, AnnotationLogExecutionTime annotationLogExecutionTime) throws Throwable {

        if(annotationLogExecutionTime.isActivate()){//Here I recover the value!!!!
            long start = System.currentTimeMillis();
            Object proceed = joinPoint.proceed();
            long executionTime = System.currentTimeMillis() - start;
            System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
            return proceed;
        }
        Object proceed = joinPoint.proceed();
        return proceed;
    }
}

解释:

我们的 advice (logExecutionTime) 将在 (joinPoint) 将使用 AnnotationLogExecutionTime (我们的自定义注释)注释的函数中执行,所以我想激活或不激活这个时间执行的计算,所以我将从我们的自定义注释的成员中获取值(您询问;))

【讨论】:

  • @EricWang 请不要忘记接受我的回答^^
  • 我想,但是..我不是 OP Lol
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多