web-dev-qa-db-ja.com

Guice:この場合、モジュールで@Providesと@Singletonをどのように構成しますか?

@Providesで注釈が付けられたモジュールにプロバイダーメソッドがあります。

@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
  ...
}

ChatServicePerformanceMonitor@Singletonの注釈を付けました。私のコードでは、このインスタンスを使用していますが、囲んでいるクラスを構築しているフレームワークのため、Guiceを「パッシブ」に注入することはできません(Guiceを使用しないため、これが唯一の方法です)参照を取得するには):

chatServicePerfMon = injector.getInstance(ChatServicePerformanceMonitor.class);

GuiceはChatServicePerformanceMonitorクラスの@Singletonアノテーションを尊重していないようです。 Injector.getInstance(ChatServicePerformanceMonitor.class)を呼び出すたびにインスタンスを取得します。

@Singletonをプロバイダーメソッドに追加すると、これが修正されるようです。

@Provides @Singleton
public ChatServicePerformanceMonitor getChatServicePerfMon() {
  ...
}

それは予想される動作ですか?インスタンスの@Singletonは私が必要とするすべてのものである必要があります。

23
Alper Akture

次のようにChatServicePerformanceMonitorを作成している場合:

_@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
  return new ChatServicePerformanceMonitor();
}
_

次に、Guiceがオブジェクトを作成していないため、クラスレベルの_@Singleton_アノテーションは効果がありません。 Guiceは、作成したオブジェクトにのみスコープを適用できます。 _@Singleton_をgetChatServicePerfMon()メソッドに追加しても問題はありません。

ChatServicePerformanceMonitorクラスに引数のないコンストラクター(または_@Inject_コンストラクター)があり、_@Provides_メソッドを削除した場合、インジェクターを継続的に呼び出すと同じシングルトンが返されます。

21
condit

当面の間、この機能は利用可能です(Guice 4.0でテスト済み)。

@Providesメソッドにも、スコープを適用するために@Singletonで注釈を付けることができるようになりました。 https://github.com/google/guice/wiki/Scopes を参照してください

26
codejanovic