同じタイプの複数のシングルトンを取得する
-
10-07-2019 - |
質問
同じ基礎型の2つのシングルトンインスタンスを取得できますか?
これは、スコープをアタッチする名前付きインスタンスに基づいているため、春には明らかに些細なことですが、実装クラスへの型のバインドに関するguiceで同等のものを見ることができません。問題のインスタンスにはguiceによって他の依存関係が注入されるため、インスタンスにバインドする必要はないことに注意してください。
解決
Guiceでは簡単です! @One
と @Two
の2つの入札アノテーションを作成してから、
bind(MySingleton.class).annotatedWith(One.class).toInstance(new MySingleton());
bind(MySingleton.class).annotatedWith(Two.class).toInstance(new MySingleton());
次に
@Inject
public SomethingThatDependsOnSingletons(@One MySingleton s1,
@Two MySingleton t2) { ... }
他のヒント
このような状況で toInstance()
またはプロバイダーメソッドを使用することに制限する必要がないことを追加して、Marcinの応答を補完したいと思います。
以下も同様に機能します:
bind(Person.class).annotatedWith(Driver.class).to(MartyMcFly.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(DocBrown.class).in(Singleton.class);
[...]
@Inject
public BackToTheFuture(@Driver Person marty, @Inventor Person doc) { ... }
MartyMcFlyクラスとDocBrownクラスをインスタンス化するときに、Guiceは通常どおり依存関係を挿入します。
同じタイプの複数のシングルトンをバインドする場合にも機能することに注意してください:
bind(Person.class).annotatedWith(Driver.class).to(Person.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(Person.class).in(Singleton.class);
これを機能させるには、Guiceモジュールで明示的に、または @Singleton
アノテーションで、 Person
がシングルトンスコープにバインドされていないことを確認する必要があります。詳細については、この要点を参照してください。
編集: 例として挙げたサンプルコードは、 Guice Grapher Test 。 Guiceテストを確認することは、APIの使用方法をよりよく理解するための優れた方法です(優れた単体テストを備えたすべてのプロジェクトにも適用されます)。
所属していません StackOverflow