3

我的问题的主要参考资料:


现在我的问题:

我正在编写一个严重依赖 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参数)。

尽管如此,所有帮助我们都非常感谢:)

4

1 回答 1

2

匹配器用于方法注释而不是方法参数注释。

Guice 没有为方法参数注释提供匹配器——您要么必须自己编写一个,要么使用其他方案。请注意,这是一个有点奇怪的用例——通常你可以侥幸逃脱

public class ExampleObject {
    @MyAnnotation
    public String foo(String param) {
        ...
    }
}

对于上面的例子,你有正确的 Guice 拦截器配置。

于 2012-12-03T21:27:36.687 回答