Перехват аннотированных методов с использованием Spring @Configuration и MethodInterceptor
Мне нужно перехватить аннотированные методы, используя spring-aop. У меня уже есть перехватчик, он реализует MethodInterceptor от AOP Alliance.
Вот код:
@Configuration
public class MyConfiguration {
// ...
@Bean
public MyInterceptor myInterceptor() {
return new MyInterceptor();
}
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
// ...
}
public class MyInterceptor implements MethodInterceptor {
// ...
@Override
public Object invoke(final MethodInvocation invocation) throws Throwable {
//does some stuff
}
}
Из того, что я читал, раньше можно было использовать аннотацию @SpringAdvice, чтобы указать, когда перехватчик должен что-то перехватывать, но этого больше не существует.
Может кто-нибудь мне помочь?
Большое спасибо!
Лукас
2 ответа
На случай, если кто-то заинтересован в этом... очевидно, это невозможно сделать. Чтобы использовать исключительно Java (и не использовать класс XML), вам необходимо использовать AspectJ и Spring с аннотациями @aspect.
Вот как закончился код:
@Aspect
public class MyInterceptor {
@Pointcut(value = "execution(* *(..))")
public void anyMethod() {
// Pointcut for intercepting ANY method.
}
@Around("anyMethod() && @annotation(myAnnotation)")
public Object invoke(final ProceedingJoinPoint pjp, final MyAnnotation myAnnotation) throws Throwable {
//does some stuff
...
}
}
Если кто-то узнает что-то другое, пожалуйста, не стесняйтесь размещать это
С Уважением,
Лукас
MethodInterceptor
можно вызвать, зарегистрировав Advisor
боб, как показано ниже.
@Configurable
@ComponentScan("com.package.to.scan")
public class AopAllianceApplicationContext {
@Bean
public Advisor advisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression("@annotation(com.package.annotation.MyAnnotation)");
return new DefaultPointcutAdvisor(pointcut, new MyInterceptor());
}
}