2016-11-02 3 views
2

すべてJSR-330のInjectとProviderの違いは何ですか?

JSR-330のInjectとProviderの違いはわかりません。 私はgoogle guiceを使用していて、毎日@Injectを使用していますが、私はJSR-330でそれがProvider<T>であることを知っています。

私の質問は

  1. Provider<T>の意味は何ですか?
  2. いつ利用できますか?Provider<T>
  3. @Injectとの違いは何ですか?

ありがとうございます。

答えて

5

すべてがすでにjavadocに説明されて、私は引用:

を直接(暗黙のうちにのみ@Injectを使用して)Tを注入に比べ、Provider<T>の注入は可能になります。

  1. 複数のインスタンスを取得します。
  2. インスタンスの遅延取得またはオプションの取得。
  3. 巡回依存関係。
  4. スコープを抽象化するので、スコープ内のインスタンスから小さいスコープのインスタンスをルックアップできます。

#1のための例:ここでは

それは工場として使用されているので、あなたは同じプロバイダからSeatの複数のインスタンスを取得します。 #2の

class Car { 
    @Inject 
    Car(Provider<Seat> seatProvider) { 
     Seat driver = seatProvider.get(); 
     Seat passenger = seatProvider.get(); 
     ... 
    } 
} 

例:ここ

あなたは我々はそれが遅いの操作であることを知っているように、直接クラスMyClassLongToCreateのインスタンスを作成しないようにプロバイダを使用するので、私たちはなまけおかげでそれを取得しますgetメソッドに追加する必要がある場合にのみ使用します。 #3の

class MyClass { 
    @Inject 
    private Provider<MyClassLongToCreate> lazy; 
    ... 
} 

例:ここでは

が、彼らはそれを解決する方法がわからないよう、いくつかのコンテナだけで例外を投げることができ、そのようなことをコンテナによって容易に解決することができない循環依存関係であります自分で私たちは次のような円形の依存関係を壊すためにコンストラクタの少なくとも一方にProviderを使用し、それを修正するには

class C1 { 
    private final C2 c2; 
    @Inject 
    C1(C2 c2) { 
     this.c2 = c2; 
     ... 
    } 
} 

class C2 { 
    private final C1 c1; 
    @Inject 
    C2(C1 c1) { 
     this.c1 = c1; 
     ... 
    } 
} 

class C1 { 
    private final Provider<C2> c2; 
    @Inject 
    C1(Provider<C2> c2) { 
     this.c2 = c2; 
     ... 
    } 
} 

これは、(コンテナが完全に最初C1のインスタンスを作成することができますC2のインスタンスを作成してC2のプロバイダを挿入する必要はありません)が完了すると、コンテナはのインスタンスをC1から作成できます。 #4のための

例:

ここでは、私たちは私たちがのインスタンスを取得できるようにするために、プロバイダを使用し、itslefが要求にスコープC1に依存したセッションにスコープされたクラスC2を持っています現在の要求に対応するC1が1つの要求から別の要求に変更されるときに発生します。

@RequestScoped 
public class C1 { 
    ... 
} 

@SessionScoped 
public class C2 { 
    @Inject 
    private Provider<C1> provider; 
    ... 
    public void doSomething() { 
     // Get the instance corresponding to the current request 
     C1 c1 = provider.get(); 
     ... 
    } 
} 
+1

例ニコラス – diligent

+0

#2のおかげで、非常に明確である - 遅いが唯一の理由ではない、あなたも実際に初期噴射時の代わりに、必要なときに作成されるオブジェクトの必要性を注入している可能性があります。 –

+0

@ThorbjørnRavnAndersen#2の場合、「#2の例」を意味しています。これは、アイデアをそれ以上表示する例に過ぎません。あなたが説明したことはすでに私の答えで言及されていますそれは "オプションの検索"です –

関連する問題