5

2 つのパラメーターを取り、インターフェースの実装を返す @Provides メソッドを持つ Guice モジュールがあります。

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);

}

これにより、Null ポインター例外 param1 がスローされます。

4

2 に答える 2

7

provides メソッドを自分で呼び出すのではなく、(この場合) ClientInterfaces 実装に最初にアクセスする必要があるときに、Guice によって呼び出されます。

ClientInterfaces を初期化するには設定パラメータが必要だと思います。

Binding-Annotation を試してみてください。最も単純なのは @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 ....
}

もちろん、通常は定数をハード コーディングする代わりに、プロパティ ファイル System.props から myHost と "8080" を読み取ります。

初めて MyService を注入する必要がある場合、Guice は提供メソッドの要件を満たすためにアノテーション付きの文字列が必要であることを認識し、Annotation 名にバインドされた値を検索します ...

于 2012-08-27T20:54:34.767 に答える
2

プロバイダー メソッドにパラメーターを渡しません。Guice はパラメーター自体を作成できる必要があります。自分でパラメーターを渡すのは意味がありません。その場合、Guice は必要ないからです。

Guice が にパラメーターを提供できるようにする場合、これらのパラメーターには、各パラメーターにバインディング アノテーションprovideServiceが必要です。両方とも同じ型であるため、Guice は、提供方法を​​知っているどの String 値をどのパラメーターに渡す必要があるかを知ることができません。

メイン コード パスparam1との間で何を渡すかがわかっている場合は、直接呼び出すことができる場所に移動します。その状況では Guice は必要ありません。param2provideService

于 2012-08-27T12:43:33.673 に答える