[解決済み] Guice:Singleton.classと@Singletonの相違点
質問
ガイスでは、何が違うのか。
// Inside your AbstractModule subclass:
@Override
public void configure() {
bind(Service.class).to(ServiceImpl.class).in(Singleton.class);
}
そして
@Override
public void configure() {
bind(Service.class).to(ServiceImpl.class);
}
@Provides @Singleton
public ServiceImpl providesService() {
return new ServiceImpl();
}
どちらも同じですか?どのような場合にどちらかを使うのでしょうか?よろしくお願いします。
解決方法は?
それらは
ほぼ
は同じです。その
@Singleton
構文が便利です。
@Provides
メソッド、またはクラスそのものにアノテーションを付けます (ただし、私はスコープアノテーションをモジュール内に保持する方が好きです)。
この違いは
どのキーがSingletonとマークされているか
とはあまり関係がない。
@Singleton
対
Singleton.class
(または
Scopes.SINGLETON
,
asEagerSingleton
,
@Singleton
クラスアノテーション、または
toInstance
暗黙のシングルトン)であり、デフォルトの構文が何を容易にしているかということに関係しています。例えば
public class MyModule extends AbstractModule {
@Override public void configure() {
bind(A.class).to(AImpl.class).in(Singleton.class);
bind(B.class).to(BImpl.class);
bind(BImpl.class).in(Singleton.class);
}
@Provides @Singleton C provideC() { return new CImpl(); }
@Provides @Singleton D provideD(DImpl dImpl) { return dImpl; }
@Provides E provideE(EImpl eImpl) { return eImpl; }
@Provides @Singleton EImpl provideEImpl() { return new EImpl(); }
}
上記では、インターフェイス
A
をクラス
AImpl
と、インターフェース
B
をクラス
BImpl
が、動作は異なります。
-
インジェクション
A
を取得すると、同じAImpl
のインスタンスを毎回作成します。 -
インジェクション
AImpl
を取得すると、別のAImpl
とは毎回異なり、すべてA
のインスタンスです。 -
インジェクション
B
を取得すると、同じBImpl
のインスタンスを毎回作成します。 -
インジェクション
BImpl
は、その同じBImpl
インスタンスB
を注入します。
見ての通り、それぞれのキーは異なっており、GuiceはインターフェイスのみがSingletonでバインドされている場合、複数の実装インスタンスを許可します。もしあなたが
A
と
B
しかし、同じInjectorから両方のインターフェースと実装をInjectした場合、異なる動作が見られるかもしれません。
同様のロジックは
@Provides
メソッドを使用します。
-
インジェクション
C
は常に同じCImpl
のインスタンスを作成します。 -
インジェクション
CImpl
は、新しいCImpl
がない限り、毎回CImpl
に注入可能なパブリック ゼロ引数コンストラクタがない場合、注入は失敗します。 -
インジェクション
D
は常に同じDImpl
のインスタンスを作成します。 -
インジェクション
DImpl
は毎回新しいインスタンスを返しますが、 それぞれがD
. -
インジェクション
E
は、同じEImpl
のインスタンスを毎回作成します。 -
インジェクション
EImpl
は、その同じインスタンスを取得します。E
を注入します。
これにより、ある程度の柔軟性が確保されます。仮に
Cache
は、最近検索されたオブジェクトを一定数保持するものであり、ここで
@User Cache
と
@Product Cache
は両方とも注射可能です。もし、あなたが
bind(Cache.class).in(Singleton.class)
の場合、オブジェクト間で共有されるCacheは1つになります。
Cache
インジェクションを使用した場合)、一方
bind(Cache.class).annotatedWith(User.class).to(Cache.class).in(Singleton.class)
の場合、アノテーションされたキーはシングルトンスコープに保持され、各オブジェクトタイプは独自のキャッシュを持つことになります。
関連
-
[解決済み】「error: '.class' expected」の意味と修正方法について
-
[解決済み】keytoolエラー 鍵屋が改ざんされたか、パスワードが不正確だった場合
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] Oracle JDKとOpenJDKの違いについて
-
[解決済み】C++ シングルトンデザインパターン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み】不正な反射的アクセスとは?
-
[解決済み】"|="の意味は何ですか?(パイプ等号演算子)
-
[解決済み】ResultSetの例外 - 結果セットの開始前
-
[解決済み] 解決済み】Javaが「型をインスタンス化できない」というエラーを返す [重複] [重複]
-
[解決済み】Javaの部分文字列:「文字列のインデックスが範囲外」。
-
[解決済み】Eclipseがエラーメッセージ "Java was started but returned exit code = 1" を返す
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】 JAVA 変数宣言はここではできない
-
[解決済み】javaで無効な文字定数