【问题标题】:Guice Provider InterceptionGuice 提供者拦截
【发布时间】:2015-10-15 10:02:14
【问题描述】:

我需要访问通过 Guice @Provides 提供的实例,所以我正在测试一种通过拦截器访问 @Provides 方法的方法......但没办法,拦截器永远不会分发。 我也不能改变 Provider Method Signature ,因为继承自另一个类....

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("---------------------------");      
    }
}

【问题讨论】:

    标签: java guice interceptor


    【解决方案1】:

    请按照此处所述检查 guice aop 的限制:https://github.com/google/guice/wiki/AOP#limitations

    实例必须由 Guice 通过 @Inject 注释或无参数构造函数创建。不能对非 Guice 构造的实例使用方法拦截。

    您正在通过“new”自己创建 StampExampleImpl(无论您在生产方法中这样做都没有关系)。因此,guice 不知道关于拦截。

    快速修复:让 guice 为您创建 impl 实例:

    @Provides
    StampInterface getStamp(StampExampleImpl se){
        se.setId("theID");
        se.setTst(System.currentTimeMillis());  
        return se;      
    }
    

    第二个问题:为什么要匹配“annotatedWith(Provides)”?您想拦截您的 StampInterface 的 getTsd() 方法,并且没有注释。注释在你模块的生产者方法上,这是另一回事。

    【讨论】:

    • 我只需要在它过期时更新一个“提供的对象”。在 sigleton 范围内,使用 @Provides 我得到一个对象...总是相同的(纯逻辑!)...。我不能使用 RequestScope ....所以我试图通过更新该对象把戏..就像拦截......但我认为没有办法。我知道可能存在模型/架构问题......但我无法更改模型((所以我试图找到任何改变它的技巧。困难((。非常感谢你
    • 这是否意味着这个问题得到了回答?或者您需要更多信息吗?也许最好提出一个描述您要解决的问题的新问题,而不是询问一种可能的解决方案的细节。
    • 它要求....但好方法是改变模型。这没有任何意义。谢谢你。
    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    相关资源
    最近更新 更多