1

Guice (3.0) に関するいくつかの記事とチュートリアルを読みましたが、「すべてを結び付ける」前にいくつかの疑問が残ります。

// 1. Binds via public, no-arg "ServiceImpl()" ctor?
bind(Service.class).to(ServiceImpl.class);

// 2. Every client-side request for a Service instance returns the same
//    ServiceImpl instance?
ServiceImpl impl = new ServiceImpl(...);
bind(Service.class).toInstance(impl);

// 3. Every client-side request for a Service instance returns the same
//    SINGLETON ServiceImpl instance?
ServiceImpl impl = new ServiceImpl(...);
bind(Service.class).in(Scopes.SINGLETON).toInstance(impl);

// 4. Should this be a call too bindConstant() instead of toInstance()
//    instead? If so, how/why?
Integer timeout = 1000 * 60;   // 60 seconds
bind(Integer.class).named(Names.named("TIMEOUT")).toInstance(timeout);

上記のコード スニペットに示されているように、私の質問は次のとおりです。

  1. を使用to(...)する場合、public no-arg ctor が使用され、毎回新しいインスタンスが返されると仮定しますか?
  2. 上記の #2 に従って、implこれまでのリクエストで同じインスタンスが使用されていますService.classか、それとも新しいインスタンスが返されていますか?
  3. 上記の #3 と同じですが、Scopes.SINGLETON指定されています。
  4. 上記のコードは問題ありませんか、それとも使用する必要がありbindConstant()ますか? もしそうなら、どのように/なぜですか?
  5. どのような状況で、いわゆるプロバイダー メソッドを使用する必要がありますか? 私はそのページの例をある程度理解していますが、私のコードでそれらの実際の使用例を見つけることになると、窒息しています.

前もって感謝します!

4

1 に答える 1

1
  1. public no-argument コンストラクター、または @Inject アノテーション付きコンストラクター (推奨) のいずれかが使用されます。ServiceImplでスコープを指定しない限り、毎回新しいインスタンスが返されます (後のbind(ServiceImpl.class).in(...)行または.@SingletonServiceImpl
  2. この場合、同じimplインスタンスがすべての注入に使用されます。Service
  3. toInstanceこれはコンパイル エラーです。これには正当な理由があります。バインディングでスコープを指定することはできません。
  4. bindConstant()プリミティブ型または文字列型の構成パラメーターなどに使用する必要があります。詳細については、この回答を参照してください。
  5. @Providesメソッドは単に s の短い書き方Provider<>です。必要がない場合は、使用しないでください。通常、オブジェクトの作成が単純なコンストラクター呼び出しよりも複雑な場合に使用する必要があります。
于 2013-09-03T14:48:13.193 に答える