@TargetSE(valueSE={METHODSE,CONSTRUCTORSE,FIELDSE}) @RetentionSE(valueSE=RUNTIMESE) @DocumentedSE public @interface Inject
注入可能なコンストラクターには @Inject
アノテーションが付けられ、0 個以上の依存関係を引数として受け入れます。@Inject
は、クラスごとに最大 1 つのコンストラクターに適用できます。
@Inject ConstructorModifiersopt SimpleTypeName(FormalParameterListopt) Throwsopt ConstructorBody
@Inject
は、他のコンストラクターが存在しない場合、引数のない public コンストラクターではオプションです。これにより、インジェクターはデフォルトのコンストラクターを呼び出すことができます。
@Injectopt Annotationsopt public SimpleTypeName() Throwsopt ConstructorBody
注入可能なフィールド:
@Inject
でアノテーションが付けられています。@Inject FieldModifiersopt Type VariableDeclarators;
注入可能なメソッド:
@Inject
でアノテーションが付けられています。@Inject MethodModifiersopt ResultType Identifier(FormalParameterListopt) Throwsopt MethodBody
インジェクターは、注入されたメソッドの結果を無視しますが、void
以外の戻り値の型は、他のコンテキスト(たとえば、ビルダースタイルのメソッドチェーン)でのメソッドの使用をサポートできます。
例:
public class Car { // Injectable constructor @Inject public Car(Engine engine) { ... } // Injectable field @Inject private Provider<Seat> seatProvider; // Injectable package-private method @Inject void install(Windshield windshield, Trunk trunk) { ... } }
@Inject
でアノテーションが付けられた別のメソッドをオーバーライドする @Inject
でアノテーションが付けられたメソッドは、インスタンスごとの注入リクエストごとに 1 回だけ注入されます。@Inject
でアノテーションされたメソッドをオーバーライドする @Inject
アノテーションのないメソッドは注入されません。
@Inject
でアノテーションが付けられたメンバーの挿入が必要です。注入可能なメンバーはアクセシビリティ修飾子( private を含む)を使用できますが、プラットフォームまたはインジェクターの制限(セキュリティ制限やリフレクションサポートの欠如など)は、非公開メンバーの注入を妨げる可能性があります。
修飾子は、注入可能なフィールドまたはパラメーターにアノテーションを付け、型と組み合わせて、注入する実装を識別することができます。修飾子はオプションであり、インジェクターに依存しないクラスで @Inject
とともに使用する場合、単一のフィールドまたはパラメーターにアノテーションを付けることができる修飾子は 1 つだけです。次の例では、修飾子は太字になっています。
public class Car { @Inject private @Leather Provider<Seat> seatProvider; @Inject void install(@Tinted Windshield windshield, @Big Trunk trunk) { ... } }
1 つの注入可能なメソッドが別の注入可能なメソッドをオーバーライドする場合、オーバーライドするメソッドのパラメーターは、オーバーライドされるメソッドのパラメーターから修飾子を自動的に継承しません。
特定の型 T とオプションの修飾子の場合、インジェクターは、次のようなユーザー指定のクラスをインジェクトできる必要があります。
例: ユーザーは外部構成を使用して T の実装を選択する場合があります。それ以上に、どの値が注入されるかは、インジェクターの実装とその構成によって異なります。
循環依存関係の検出と解決は、インジェクター実装の課題として残されています。2 つのコンストラクター間の循環依存関係は明らかな問題ですが、注入可能なフィールドまたはメソッド間に循環依存関係を持つこともできます。
class A { @Inject B b; } class B { @Inject A a; }
A
のインスタンスを作成するとき、単純なインジェクターの実装では、B
のインスタンスを作成して A
にセットし、2 番目の A
のインスタンスを作成して B
にセットし、2 番目の B
のインスタンスを作成して A
の 2 番目のインスタンスにセットする、というように無限ループに陥る可能性があります。
保守的なインジェクターは、ビルド時に循環依存を検出してエラーを生成する可能性があります。その時点で、プログラマーは A
または B
の代わりに Provider<A>
または Provider<B>
を注入することにより、循環依存を破ることができます。提供されたコンストラクターまたはメソッドからプロバイダーで get()
を直接呼び出すと、循環依存関連を分割するプロバイダーの機能が無効になります。メソッドまたはフィールドインジェクションの場合、依存関連の 1 つをスコープする(たとえば、シングルトンスコープを使用する)ことで、有効な循環関連を有効にすることもできます。
@Qualifier
, Provider
Copyright © 2019 Eclipse Foundation.
Use is subject to license terms.