私はあなたの理解は正しいと思っていますが、どのような種類の再利用が影響を受けるか微妙に分かります。
おそらくthe Guice wiki on Scopes(強調鉱山)からこのテキストを参照している:
in()
句はスコープ注釈のいずれかを受け入れるようServletScopes.REQUEST
ようRequestScoped.class
ともScope
インスタンス:
bind(UserPreferences.class)
.toProvider(UserPreferencesProvider.class)
.in(ServletScopes.REQUEST);
は、注釈は、異なる種類のアプリケーションでモジュールを再利用できるので好ましい。 たとえば、@RequestScoped
オブジェクトは、WebアプリケーションのHTTP要求と、それがAPIサーバーの場合はRPCにスコープできます。でもGuiceのサーブレットの固有のスコープで
、あなたはスコープインスタンスServletScopes.REQUESTと@RequestScoped annotationの間で選択、および(ScopedBindingBuilderを参照)に応じてin(Scope scope)
とin(Class scopeAnnotation)
の間で選択することができます。ほぼすべてのスコープに対応するアノテーションが必要です。これらのアノテーションは、クラスや@Providesメソッドで特に役立ちます。
それは常にScope instance実際にスコーピング行動(それが適切な条件で既に返されたインスタンスを返すことができるように具体的には、スコープを持たないプロバイダを包む)を実装することがありますことをここに実現することが重要です。注釈をScopeインスタンスに関連付けるには、ScopeアノテーションクラスとScopeインスタンスを受け付けるモジュールがbindScope
を呼び出すことを確認する必要があります。サーブレット用、Guice has this binding automatically installed via InternalServletModule。
@Override
protected void configure() {
bindScope(RequestScoped.class, REQUEST);
bindScope(SessionScoped.class, SESSION);
// ...
}
のでin(Class scopeAnnotation)
を使用する利点は何ですか? Scopeインスタンスにバインドするとき、bindScope
を使用して注釈を別のScopeインスタンスにバインドする機会をユーザーに許可するのではなく、使用するScopeインスタンスを正確にGuiceに伝えます。上の太字の例では、実際のGuiceサーブレット拡張(注釈以外)を使用せずに同じモジュールを使用すると想像できますが、注釈クラスにバインドしてbindScope
自分でを呼び出した場合にのみ可能です。 in(Scope)
を使用してバインドする場合は、その行を変更するか、新しいモジュールを作成する必要があります。
それはあなたがあなたのアプリケーション全体で一貫してあなたのスコープの動作を変更することができますので、これは、独自のカスタムスコープインスタンスと注釈のために特に重要である:
@Override public void configure() {
// BAD: To change the scope, you'll need to change three lines.
// If you don't change all three together, you'll get inconsistent behavior.
bind(A.class).to(AImpl.class).in(MyScope.INSTANCE);
bind(B.class).to(BImpl.class).in(MyScope.INSTANCE);
bindScope(AScoped.class, MyScope.INSTANCE);
}
@Override public void configure() {
// GOOD: To change the scope, you can change one line, and optionally
// extract that line to a separate Module.
bind(A.class).to(AImpl.class).in(AScoped.class);
bind(B.class).to(BImpl.class).in(AScoped.class);
bindScope(AScoped.class, MyScope.INSTANCE);
}