Spring AOP: Getting parameters of the pointcut annotation
Consider I have defined the following aspect:
@Aspect
public class SampleAspect {
@Around(value="@annotation(sample.SampleAnnotation)")
public Object display(ProceedingJoinPoint joinPoint) throws Throwable {
// ...
}
}
and the annotation
public @interface SampleAnnotation {
String value() default "defaultValue";
}
Is there a way to r开发者_开发技巧ead the value parameter of the annotation SampleAnnotation in the display method if my aspect?
Thanks for your help, erik
Change the advice signature to
@Around(value="@annotation(sampleAnnotation)")
public Object display(ProceedingJoinPoint joinPoint, SampleAnnotation sampleAnnotation ) throws Throwable {
// ...
}
and you will have access to the value in the annotation.
See docs for more info.
Bellow I'll add a complete example of AOP implementation where I'll getting parameter from my Custom pointCut annotation, where my advice aim to calculate the time execution of a function:
1- Custom Annotation:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationLogExecutionTime {
public boolean isActivate() default false;
}
2- Controller:
@AnnotationLogExecutionTime(isActivate = true)
@PostMapping("/connection")
public HttpEntity<String> createAuthenticationToken(HttpServletRequest request,
@RequestBody AuthenticationRequest authenticationRequest) {...}
3- Advice
@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;
}
}
Explanation:
Our advice (logExecutionTime) will be excuted around (joinPoint) the function that will be annotated with AnnotationLogExecutionTime (our custom annotation) so I want to active or not this the calculation of time execution so I'll get the value from the membre of our custom annotation (which you ask about ;) )
I was confused on how to map this before.
@Before("@annotation(any_variable_name) && args(spring_will_find_its_type_to_match)")
public void myAdvice(JoinPoint joinPoint, MyAnnotation any_variable_name, MyClass spring_will_find_its_type_to_match) {
System.out.println("before testing in Aspect myAdvice " + spring_will_find_its_type_to_match);
}
精彩评论