2012-08-27 58 views
3

我有一個具有@Provides方法,它需要兩個參數,並返回該接口的實現一個吉斯模塊:參數傳遞到吉斯@Provides方法

public class **ClientModule** extends **AbstractModule**{ 

@Override 
protected void configure(){ 

} 

@Singleton 
@Provides 
protected ClientInterfaces provideService(String param1, String param2){ 
    returns something 
} 

} 

在我的主類,注入的模塊,如何我是否將參數傳遞給@Provides方法?

public MainClass{ 
main(){ 
Injector injector = Guice.createInjector(new ClientModule()); 
MainClass mainClass = injector.getInstance(MainClass.class); 

} 

這將拋出一個空指針異常參數1

+0

你必須申報將你的Guice模塊綁定到'provideService'方法中的參數。 – eiden

回答

5

你不要自己調用一個提供方法,當你第一次需要訪問(在這種情況下)你的ClientInterfaces實現時,它被Guice調用。

我假設,你需要配置參數來初始化你的ClientInterfaces。

所以儘量綁定註釋,最簡單的就是@Named:

configure() { 
    bindConstant().annotatedWith(Names.named("hostName")).to("myHost"); 
    bindConstant().annotatedWith(Names.named("port")).to("8080"); 
} 
@Provides 
@Singleton 
public MyService provideMyService(@Named("hostName") String host, @Named("port") String port) { 
    // init MyService 
    return .... 
} 

當然,你通常會讀MYHOST和「8080」從屬性文件System.props而不是硬編碼的常數。

第一次需要注入的MyService,吉斯會發現,它需要註釋的字符串履行提供方法的要求,並搜索綁定到Annotatioon名稱值...

+1

我建議自定義綁定註釋優先使用@Named:http://code.google.com/p/google-guice/wiki/BindingAnnotations。這是更多的代碼,但我喜歡編譯時檢查,以及任何IDE的重命名重構都可以在定製註釋中使用。 –

+1

絕對如此。但我在這裏假設初學者水平,並不想打開另一桶...... –

1

你不傳遞參數給提供方法。 Guice需要能夠自己創建參數。你自己傳遞參數是沒有意義的,因爲那樣就不需要Guice。

如果您希望Guice能夠提供參數至provideService,那麼這些參數對每個參數都需要binding annotation。由於它們都具有相同的類型,因此Guice無法知道應該爲哪個參數傳遞它知道如何提供哪些String值。

如果您知道要從主代碼路徑中傳遞param1param2的內容,請將provideService移動到可以直接調用的地方。在那種情況下不需要Guice。

+0

我覺得這個答案比幫助更困惑。因此,每當我知道ServiceProvider需要什麼(配置)參數時,就不需要Guice? –

+0

你是對的。由於我的匆忙放在一起並且誤導了你,所以我提出了你的迴應,而你的代碼示例使事情變得非常清楚。 –