我正在尝试打印“你好,AOP!”每当Guice / AOP联盟拦截标有特定(自定义)注释的方法时,就会发出消息。我已经按照官方文档(可以在第11页上找到here - AOP方法拦截内容的PDF文件)进行操作,并且无法使其工作,只能编译。
首先,我的注释:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@BindingAnnotation
public @interface Validating {
// Do nothing; used by Google Guice to intercept certain methods.
}
然后,我的Module
实施:
public class ValidatingModule implements com.google.inject.Module {
public void configure(Binder binder) {
binder.bindInterceptor(Matchers.any(),
Matchers.annotatedWith(Validating.class,
new ValidatingMethodInterceptor()),
}
}
接下来,我的方法拦截器:
public class ValidatingMethodInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Hello, AOP!");
}
}
最后,尝试使用所有这些AOP的驱动程序:
public class AopTest {
@Validating
public int doSomething() {
// do whatever
}
public static main(String[] args) {
AopTest test = new AopTest();
Injector injector = Guice.createInjector(new ValidatingModule());
System.out.println("About to use AOP...");
test.doSomething();
}
}
当我运行这个小测试驱动程序时,我得到的唯一控制台输出是About to use AOP...
... Hello, AOP!
永远不会被执行,这意味着@Validating doSomething()
方法永远不会被截获Guice文档显示的方式。
我能想到的唯一的事实是,在我的Module
实现中,我指定要绑定的MethodInterceptor
(作为{{的第3个参数) 1}}方法)作为bindInterceptor
,而在那个拦截器中,我只定义了一个必需的new ValidatingMethodInterceptor()
)方法。
也许我没有正确连接这两个?也许Guice没有隐含地知道拦截发生时应该运行invoke(MethodInvocation
方法?!?!
然后,我不仅跟着Guice文档,我还跟着其他几个教程无济于事。
我有什么明显的遗失吗?提前谢谢!
编辑我的代码和我遵循的示例之间的另一个差异,虽然很小,但我的invoke
方法(在拦截器内部)没有注释{{1} }。如果我尝试添加此注释,我会收到以下编译错误:
ValidatingMethodInterceptor类型的方法invoke(MethodInvocation)必须覆盖超类方法。
此错误有意义,因为invoke
是一个接口(不是类)。然后,每个使用Guice / AOP联盟的示例都在@Override
方法上使用此org.aopalliance.intercept.MethodInterceptor
注释,因此它显然可以为某些人工作/编译......很奇怪。
答案 0 :(得分:10)
如果你不让Guice构造你的对象,它就不能为你提供一个被拦截的实例。您不得使用new AopTest()
来获取对象的实例。相反,你必须要求Guice给你一个例子:
Injector injector = Guice.createInjector(new ValidatingModule ());
AopTest test = injector.getInstance(AopTest.class);
请参阅http://code.google.com/p/google-guice/wiki/GettingStarted