2015-10-15 131 views
0

我需要訪問通過Guice @Provides提供的實例,所以我正在測試一種方法來通過攔截器訪問@Provides方法......但沒辦法,攔截器從不分散。 此外,我不能改變供應商的方法簽名,事業繼承自另一類....Guice Provider攔截

public class MyModule extends AbstractModule{ 

    public static class MyInterceptor implements MethodInterceptor{ 
     @Override 
     public Object invoke(final MethodInvocation methodInvocation) throws Throwable {  
      System.out.println("MyModule ::: [email protected]! : "+ 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

請檢查吉斯AOP的限制,如下所述:https://github.com/google/guice/wiki/AOP#limitations

實例必須通過創建Guice by @ Inject-annotated或者無參數構造函數對於非Guice構造的實例,不可能使用方法攔截。

您正在通過「新建」自己創建StampExampleImpl(在生產方法中不要緊)。因此,guice在攔截方面並不知情。

快速修復:讓吉斯爲您創建IMPL實例:

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

第二個問題:爲什麼匹配 「annotatedWith(提供)」?你想攔截StampInterface的getTsd()方法,並且沒有註釋。該註釋位於模塊的生產者方法中,這是不同的事情。

+0

我只是需要更新一個「提供的對象」,當它過期。在sigleton作用域中,使用a @ @Provides我得到一個對象...總是相同的(純邏輯!)....我不能使用RequestScope ....所以我試圖通過一個更新對象伎倆......截獲......但我認爲沒有辦法。我知道也許有模型/ arquitecture問題......但我不能改變模型((所以我試圖找到任何詭計來改變它)很難((。非常感謝你 – Azimuts

+0

這是否意味着這個問題是回答?或者您是否需要其他信息?也許最好提出一個新問題來描述您想解決的問題,而不是詢問一個可能的解決方案的細節 –

+0

它問......但好方法是改變模型,這沒有意義,謝謝你。 – Azimuts