5.3. バイジェクション


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

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat