2016-09-27 139 views
2

我有獲取並保持一個API令牌(簡化的)的模塊:注入依賴成吉斯模塊

@Singleton 
public class KeyHolderModule extends AbstractModule { 
    // This doesn't seem to be injected 
    private @Inject TokenConnector connector; 
    private DateTime keyLastRefreshed; 
    private String key; 
    private Credentials creds = config.getCreds(); 

    @Override protected void configure() { 
     this.key = connector.getToken(creds); 
     this.keyLastRefreshed = DateTime.now(); 
    } 

    @Provides @Named("apiKey") public String getKey() { 
     // logic to check key last refreshed and handle generating a new one 
     return this.key; 
    } 
} 

我上線一個空指針錯誤,我試圖訪問連接器(this.key = connector.getToken(creds);) ,所以連接器顯然沒有正確接線。

我試着創建一個構造函數,並使用@Inject那裏,但我手動將這些模塊通過new添加到我的應用程序bootstrap類中的列表中,所以這是有點。

顯然我錯過了這裏的東西 - 我可能只是new上漲了TokenConnector在這種情況下,因爲它本身沒有任何依賴關係,但是這並不能解決我根本無法理解這裏發生的事情。所以,如果你想看到(簡化)其他代碼段,或者簡化了這段代碼,請告訴我。

回答

6

儘管您不能使用@Inject作爲模塊(除非您從另一個噴油器獲取模塊,我強烈建議使用該模塊),您可以輕鬆地將其注入到@Provides方法中。

public class KeyHolderModule extends AbstractModule { 
    private DateTime keyLastRefreshed; 
    private String key; 
    private Credentials creds = config.getCreds(); 

    @Override protected void configure() {} 

    @Provides @Named("apiKey") public String getKey(
      TokenConnector connector) { 
     // logic to check key last refreshed and handle generating a new one 
     this.key = connector.getToken(creds); 
     this.keyLastRefreshed = DateTime.now(); 

     return this.key; 
    } 
} 

的這裏訣竅是,一個模塊通常在噴射器創建時間手動實例化,但@Provides方法當需要它們提供的依賴調用。因此,在構建模塊時,注入器尚未準備好提供任何東西,但在整個應用生命週期中調用的方法都可以訪問它們可能需要的任何其他注入器提供的依賴關係。當configure運行時,噴油器尚未創建,最好的方法是致電getProvider(儘管在噴油器準備就緒之前,您無法致電get)。

我寫了各種其他模塊內注入技術,如this SO answer

+0

或者我認爲另一種方法是綁定一個key-provider,它可以注入並封裝邏輯+返回鍵。這與使用@Provides的guice相同嗎? – pandaadb

+1

@pandaadb我不知道你是否指任何我不熟悉的技術_key-provider_術語,但我肯定會認爲這對模塊來說有點沉重。如果這是我的代碼審查,我當然會考慮將此提交給'提供者'頂級類,或隨機提供的按鍵POJO(這可能是你的意思)。 –

+0

Cheers Jeff - 是的,我最終把這件事搬到了另一個班上(但是對我發現自己的情況很好奇,因爲它似乎反映了我對guice的理解上的差距。 ,我會標記爲已接受 –