14

基になる同じ型の 2 つのシングルトン インスタンスを取得できますか?

これは、スコープをアタッチする名前付きインスタンスに基づいているため、春には明らかに簡単ですが、型を実装クラスにバインドすることに関する同等のものは見当たりません。問題のインスタンスには偽装によって他の依存関係が注入されるため、インスタンスにバインドする必要はありません。

4

2 に答える 2

16

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の使用方法をよりよく理解するための優れた方法です(これは、優れた単体テストを持つすべてのプロジェクトにも適用されます)。

于 2009-09-10T21:06:02.867 に答える
16

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) { ... }
于 2009-08-03T13:28:30.320 に答える