Перехват аннотированных методов с использованием 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());
    }

}
Другие вопросы по тегам