Guice Provider拦截

时间:2015-10-15 10:02:15

标签: java guice interceptor

我需要访问通过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("---------------------------");      
    }
}

1 个答案:

答案 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方法上,这是另一回事。