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
Ответы
Ответ 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 (наша пользовательская аннотация), поэтому я хочу активировать или нет этот расчет времени выполнения поэтому я получу значение из нашей пользовательской аннотации (о которой вы спрашиваете;))