すべてJSR-330のInjectとProviderの違いは何ですか?
JSR-330のInjectとProviderの違いはわかりません。 私はgoogle guiceを使用していて、毎日@Inject
を使用していますが、私はJSR-330でそれがProvider<T>
であることを知っています。
私の質問は
Provider<T>
の意味は何ですか?- いつ利用できますか?
Provider<T>
? @Inject
との違いは何ですか?
ありがとうございます。
すべてJSR-330のInjectとProviderの違いは何ですか?
JSR-330のInjectとProviderの違いはわかりません。 私はgoogle guiceを使用していて、毎日@Inject
を使用していますが、私はJSR-330でそれがProvider<T>
であることを知っています。
私の質問は
Provider<T>
の意味は何ですか?Provider<T>
?@Inject
との違いは何ですか?ありがとうございます。
すべてがすでにjavadocに説明されて、私は引用:
を直接は(暗黙のうちにのみ
@Inject
を使用して)T
を注入に比べ、Provider<T>
の注入は可能になります。
- 複数のインスタンスを取得します。
- インスタンスの遅延取得またはオプションの取得。
- 巡回依存関係。
- スコープを抽象化するので、スコープ内のインスタンスから小さいスコープのインスタンスをルックアップできます。
#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();
...
}
}
例ニコラス – diligent
#2のおかげで、非常に明確である - 遅いが唯一の理由ではない、あなたも実際に初期噴射時の代わりに、必要なときに作成されるオブジェクトの必要性を注入している可能性があります。 –
@ThorbjørnRavnAndersen#2の場合、「#2の例」を意味しています。これは、アイデアをそれ以上表示する例に過ぎません。あなたが説明したことはすでに私の答えで言及されていますそれは "オプションの検索"です –