Подтвердить что ты не робот

Spring AOP: получение параметров аннотации pointcut

Считаю, что я определил следующий аспект:

@Aspect
public class SampleAspect {

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

и аннотации

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

Есть ли способ прочитать параметр значения аннотации SampleAnnotation в методе отображения, если мой аспект?

Спасибо за вашу помощь, Erik

4b9b3361

Ответ 1

Измените подпись для

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

и вы получите доступ к значению в аннотации.

Подробнее см. docs.

Ответ 2

Ниже я добавлю полный пример реализации AOP, где я получу параметр из своей пользовательской аннотации 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;
    }
}

Объяснение:

Наш совет (logExecutionTime) будет извиняться вокруг (joinPoint) функции, которая будет аннотирована с помощью AnnotationLogExecutionTime (наша пользовательская аннотация), поэтому я хочу активировать или нет этот расчет времени выполнения поэтому я получу значение из нашей пользовательской аннотации (о которой вы спрашиваете;))