基になる同じ型の 2 つのシングルトン インスタンスを取得できますか?
これは、スコープをアタッチする名前付きインスタンスに基づいているため、春には明らかに簡単ですが、型を実装クラスにバインドすることに関する同等のものは見当たりません。問題のインスタンスには偽装によって他の依存関係が注入されるため、インスタンスにバインドする必要はありません。
基になる同じ型の 2 つのシングルトン インスタンスを取得できますか?
これは、スコープをアタッチする名前付きインスタンスに基づいているため、春には明らかに簡単ですが、型を実装クラスにバインドすることに関する同等のものは見当たりません。問題のインスタンスには偽装によって他の依存関係が注入されるため、インスタンスにバインドする必要はありません。
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) { ... }
Guiceは、MartyMcFlyクラスとDocBrownクラスをインスタンス化するときに、通常どおり依存関係を挿入します。
同じタイプの複数のシングルトンをバインドする場合にも機能することに注意してください。
bind(Person.class).annotatedWith(Driver.class).to(Person.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(Person.class).in(Singleton.class);
Person
これを機能させるには、Guiceモジュールで明示的に、または@Singleton
アノテーションを使用して、シングルトンスコープでバインドされていないことを確認する必要があります。この要点の詳細。
編集:例として示すサンプルコードは、GuiceGrapherTestからのものです。Guiceテストを確認することは、APIの使用方法をよりよく理解するための優れた方法です(これは、優れた単体テストを持つすべてのプロジェクトにも適用されます)。
Guiceでも簡単!2 つの入札アノテーションを作成し@One
ます@Two
。
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) { ... }