2017-11-21 11 views
0

私はインスタンスにクラスをバインドしたいが、Guiceは私にを与えてくれません。それ自身にバインドポイントがありますエラー。私はまた、インスタンスをシングルトンにしたい。Guice Beginner - 具体的なクラスをバインドする方法 - Singleton?

もう少し背景を与える。バインドしたいクラスがありますが、bindClassとinstanceClassが異なる必要があるため、できません。結合しないために

Guice Beginner - How to bind concrete classes?

受け入れ答えがあるとしてみましょう:ここで見つけることができます - 「具体的なクラスをバインドする方法をGuiceの初級」のタイトルで質問があります

//This fails when bindClass==instanceClass 
bind((bindClass)).to(instanceClass).in(Singleton.class); 

「Just In Time」バインディングが仕事をします。

しかし、インスタンスのシングルトンが必要な場合はどうすればよいですか?

答えて

2
// eager singleton always 
bind(YourClass.class).asEagerSingleton(); 

// eager in prod, lazy in dev 
bind(YourClass.class).in(Singleton.class); 

これはBinder class-level docsに、bindステートメントの他の多くのバリエーションと一緒に、リストされている:

bind(ServiceImpl.class).in(Singleton.class); 
// or, alternatively 
bind(ServiceImpl.class).in(Scopes.SINGLETON); 

これらのステートメントのいずれかがシングルトンスコープにServiceImplクラスを配置します。 GuiceはServiceImplのインスタンスを1つしか作成せず、このタイプのすべての注入要求に対して再利用します。前の例のように、2番目のバインディングがアノテーションで修飾されている場合、ServiceImplの別のインスタンスをバインドすることは可能です。 Guiceはあなたの "シングルトン"の複数のインスタンスを作成できないように心配しているわけではありません。それは、単に@Singletonを持つクラスをマークし、JITのバインディングに依存して働くだろうけど

、あなたのグラフを検証しGuiceのの面でモジュールに結合を配置し、熱心に初期化を実行することには利点があります。これは、ライブトラフィックを新しくロードされたサーバーインスタンスにリダイレクトする前に初期化が行われる可能性が高いため、サーバーコンテキストで特に役立ちます。

Scopes wiki pageのeager/lazyシングルトンローディングの詳細を参照してください。

+0

私が探しているもののようなものです。私は明日それを試してみましょう。フォローアップの質問がない場合、私はあなたの答えを受け入れたものとしてマークします。どうもありがとう! – jhertz

関連する問題