5.3. バイジェクション
依存性の注入 または 制御の反転 (IoC) により、 コンテナが setter メソッドあるいはインスタンス変数にコンポーネントを「インジェクト」することで、あるコンポーネントが他のコンポーネントを参照することが可能となります。これまでの依存性の注入の実装では、インジェクションはコンポーネントの構成時に起こるため、 参照はコンポーネントインスタンスのライフタイムの間は変化しませんでした。これはステートレスコンポーネントには理にかなっています。 クライアントの観点から見ると、特定のステートレスなコンポーネントの全インスタンスは交換可能です。一方、 Seam はステートフルなコンポーネントの使用に重点を置いているため、構成としての従来の依存性の注入は有用ではなくなりました。Seam はインジェクションの一般化として バイジェクション の概念を導入しています。 インジェクションと対比すると、 バイジェクションは以下のようになります。
- コンテキスト依存
- バイジェクションは各種のコンテキストからステートフルなコンポーネントを組み立てるために使用されます。 より広い コンテキストからのコンポーネントは より狭い コンテキストからのコンポーネントへの参照を行うこともできます。
- 双方向的
- 値はコンテキスト変数から呼び出されたコンポーネントの属性にインジェクトされ、コンテキストに戻されます (アウトジェクション)。 これによりそれ自体のインスタンス変数を設定するだけで、呼び出されたコンポーネントはコンテキスト依存の変数の値を操作することができます。
- 動的
- コンテキスト依存の変数の値は時間経過で変化し、 Seam のコンポーネントはステートフルであるため、 バイジェクションはコンポーネントが呼び出されるたびに発生します。
要するに、インスタンス変数の値がインジェクトされる、 またはアウトジェクトされる、 あるいはその両方が行われることを指定することで、バイジェクションによりコンテキスト変数をコンポーネントのインスタンス変数にエイリアスできます。アノテーションを使用してバイジェクションを有効にします。
@In アノテーションは値がインスタンス変数または setter メソッドにインジェクトされることを指定します。 インスタンス変数の場合、
setter メソッドの場合、
デフォルトでは、 Seam はプロパティ名またはインジェクトされたインスタンス変数名を使用してすべてのコンテキストの優先順位検索を行います。 例えば、
@In("currentUser") を使って明示的にコンテキスト変数名を指定したいと思われるかもしれません。
名前付きコンテキスト変数にバインドされた既存のコンポーネントインスタンスが存在しないときに Seam にコンポーネントのインスタンスを作成させたい場合は、
@In(create=true) を指定します。 値がオプションで (null でも可能) あれば @In(required=false) を指定します。
いくつかのコンポーネントでは、 使用されるたびに
@In(create=true) を指定することは同じ動作の繰り返しとなる場合があります。 このような場合、 コンポーネントに @AutoCreate アノテーションを付与します。 これにより create=true を明示的に使用しなくても必要なときに常に作成されるようになります。
式値をインジェクトすることも可能です。
インジェクトした値はメソッドの完了とアウトジェクションの直後にディスインジェクトされます (つまり
null に設定されます)。
(コンポーネントのライフサイクルおよびインジェクションについての詳細は次の章を参照してください。)
@Outアノテーションは属性がインスタンス変数または getter メソッドのいずれかからアウトジェクトされることを指定します。 インスタンス変数の場合、
getter メソッドの場合、
属性はインジェクト、アウトジェクトされることが可能です。
または