0

据我所知,在 Spring AOP 中,当我们想要拦截某个方法调用时,我们配置了一个具有匹配所需方法调用的切入点配置的 Aspect。换句话说,我们在 Aspect 端配置拦截。

有没有办法完全从另一端配置它,即在要拦截调用的方法上?我希望这样的事情是可能的:

@Component
class MyClass {
    @Intercept(interctptor="myInterceptor", method="invoke")
    Object methodThatWillBeIntercepted(Object arg) {
        // ..
    }
}

@Component(value="myInterceptor")
class MyInterceptor {
   Object invoke(MethodInvocation mi) {
      // ...
      if (someCondition) {
         return mi.proceed();
      } else {
         return someOtherValue;
      }
   }
}
4

1 回答 1

1

你可以,至少如果你将它与 AspectJ 一起使用的话。您可以使用@annotation(com.mycompany.MyAnnotation)切入点声明中的语法来定位使用您的注释进行注释的元素。您可以在 Spring 参考文档的第 9.2.3 节中阅读更多相关信息

如果您不使用 AspectJ,而是使用基于通用代理的拦截器,则“蛮力”方法是代理您要检查的所有对象,然后检查方法调用参数以查看该方法是否使用您的注释进行了注释,像这样的东西:

class MyInterceptor {
    public Object invoke(MethodInvocation mi) {
        if(mi.getMethod().getAnnotation(MyAnnotationClass.class) != null) {
            // Do the interception
        }
        else {
            return mi.proceed();
        }
    }
}

不记得 MethodInvocation 的确切 API,但类似的东西。

于 2013-04-02T12:15:27.563 回答