2017-02-12 3 views
1

Guiceでは、特定のインスタンスの有効期間を指定すると、bind(Applebees.class).in(Singleton.class);のような有効範囲付き注釈を使用します。 それとも、Guiceのスコープインスタンスとスコープインスタンスの違い

bind(UserPreferences.class) 
     .toProvider(UserPreferencesProvider.class) 
     .in(ServletScopes.REQUEST); 

のようなスコープのインスタンスを使用できるように表示され、前者のアプローチは、モジュールのクラスを再利用するために私達にできるので、正式にGuiceには、前者のアプローチを推奨しています。 しかし、私はその点については分かりません。私の前提はこのようなものなので、これが正しいかどうか確認してください。

スコープ・インスタンスはServeletの用語なので、スコープ・アノテーションの代わりにスコープ・インスタンスを採用すると、ModuleクラスはServeletにのみ適用されます。一方、スコープアノテーションを使用すると、Guiceを放棄しない限り、Moduleクラスを再利用できます。

これは正しいですか?確認できますか?

答えて

0

私はあなたの理解は正しいと思っていますが、どのような種類の再利用が影響を受けるか微妙に分かります。

おそらく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); 
} 
関連する問題