我的问题的主要参考资料:
- 为 Google Guice 编写方法拦截器:http ://code.google.com/p/google-guice/wiki/AOP
- MethodInterceptor 接口的 JavaDoc:http: //aopalliance.sourceforge.net/doc/org/aopalliance/intercept/MethodInterceptor.html
- 关于 Java 注释的一般参考:http: //docs.oracle.com/javase/tutorial/java/javaOO/annotations.html和http://docs.oracle.com/javase/1.5.0/docs/guide/language/注释.html
现在我的问题:
我正在编写一个严重依赖 Google Guice 创建对象和处理依赖注入的 Java 应用程序。我正在尝试使用拦截器在执行某些带注释的方法之前运行预处理代码。到目前为止,我已经成功地能够MethodInterceptor
使用 Guice 的指令对已注释的方法执行拦截器(使用接口)。但是,我现在想编写将在Parameter Annotations上执行的拦截器。
这是一个示例场景。首先,我创建自己的注释。例如::
@BindingAnnotation
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface MyParameterAnnotation {
}
接下来,我为此注释编写自己的拦截器:
public class MyParameterAnnotationInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
// Do some stuff
return invocation.proceed();
}
}
这是我打算如何使用的示例@MyParameterAnnotation
:
public class ExampleObject {
public String foo(@MyParameterAnnotation String param) {
...
}
}
最后,我需要创建一个 Guice Injector 并使用它来创建一个 instalce ExampleObject
,否则我无法在这个项目中使用方法拦截器。我将 Injector 配置MyParameterAnnotationInterceptor
为绑定到@MyParameterAnnotation
,如下所示:
final MethodInterceptor interceptor = new MyParameterAnnotationInterceptor();
requestStaticInjection(MyParameterAnnotationInterceptor.class);
bindInterceptor(Matchers.any(), Matchers.annotatedWith(MyParameterAnnotation.class), interceptor);
当我按照上述步骤执行对 的调用时ExampleObject.foo()
,不幸的是,尽管参数标记为 ,但拦截器并未执行@MyParameterAnnotation
。请注意,如果将注释放在方法级别,则这些类似的步骤将起作用。
这导致我得出两个可能的结论:Guice 不支持将拦截器绑定到参数注释,或者我正在做一些完全不正确的事情(也许我应该为拦截器使用另一个 AOP 联盟接口,如FieldInterceptor,但我非常怀疑这是因为Guice 的 AbstractModule 的 JavaDoc建议该bindInterceptor()
方法只能使用MethodInterceptor
参数)。
尽管如此,所有帮助我们都非常感谢:)