簡體   English   中英

Guice提供商攔截

[英]Guice Provider Interception

我需要訪問通過Guice @Provides提供的實例,所以我正在測試一種通過Interceptor訪問@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("---------------------------");      
    }
}

請按照以下說明檢查guice aop的限制: https : //github.com/google/guice/wiki/AOP#limitations

實例必須由Guice由帶有@Inject注釋或無參數的構造函數創建。無法對非Guice構造的實例使用方法攔截。

您可以通過“ new”自己創建StampExampleImpl(無關緊要,您可以在Produces方法中創建)。 因此,guice對於攔截不了解。

快速修復:讓guice為您創建impl實例:

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

第二個問題:為什么要匹配“ annotatedWith(Provides)”? 您想攔截StampInterface的getTsd()方法,但未添加注釋。 批注位於模塊的生產者方法上,這是另一回事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM