使用Spring @Configuration和MethodInterceptor拦截带注释的方法

时间:2012-12-13 14:43:53

标签: spring-aop aopalliance

我需要使用spring-aop拦截带注释的方法。 我已经有了拦截器,它实现了AOP Alliance的MethodInterceptor。

以下是代码:

@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 个答案:

答案 0 :(得分:3)

注册MethodInterceptor bean可以调用

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());
    }

}

答案 1 :(得分:2)

如果有人对此感兴趣......显然这是不可能做到的。 为了单独使用Java(并且没有XML类),您需要使用带有@aspect注释的AspectJ和Spring。

这就是代码结束的方式:

@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
        ...
    }
}

如果有其他人发现不同的东西,请随意发布!

此致

卢卡斯