我需要访问通过Guice @Provides提供的实例,所以我正在测试一种通过拦截器访问@Provides方法的方法......但是没有办法,拦截器永远不会分心。 此外,我无法更改提供者方法签名,导致从另一个类继承......
public class MyModule extends AbstractModule{
public static class MyInterceptor implements MethodInterceptor{
@Override
public Object invoke(final MethodInvocation methodInvocation) throws Throwable {
System.out.println("MyModule ::: Intercepted@invoke! : "+ methodInvocation.getMethod().getName());
return methodInvocation.proceed();
}
}
@Provides
StampInterface getStamp(){
StampExampleImpl se = new StampExampleImpl();
se.setId("theID");
se.setTst(System.currentTimeMillis());
return se;
}
@Override
protected void configure() {
bindInterceptor(Matchers.any(),
Matchers.annotatedWith(Provides.class),
new MyInterceptor());
}
public static void main(String... args) {
StampInterface s = Guice.createInjector(new MyModule()).getInstance(StampInterface.class);
System.out.println( s.getTst());
System.out.println("---------------------------");
}
}
答案 0 :(得分:1)
请按照此处所述检查guice aop的限制:https://github.com/google/guice/wiki/AOP#limitations
实例必须由Guice通过@Inject-annotated或无参数构造函数创建。不可能对非Guice构造的实例使用方法拦截。
您正在通过“new”创建StampExampleImpl(在yield方法中这样做无关紧要)。因此,guice在拦截方面不了解它。
快速修复:让guice为您创建impl实例:
@Provides
StampInterface getStamp(StampExampleImpl se){
se.setId("theID");
se.setTst(System.currentTimeMillis());
return se;
}
第二个问题:为什么匹配“annotatedWith(提供)”?您想拦截StampInterface的getTsd()方法,并且没有注释。注释位于模块的producer方法上,这是另一回事。