5.8. ファクトリとマネージャのコンポーネント


Seam コンポーネントではないオブジェクトを扱わなければならないこともよくありますが、@In を使用して Seam コンポーネントにインジェクトし、値メソッドバインディング式およびメソッドバインディング式でそれらを使用して Seam コンテキストのライフサイクルに関連付けたい場合があります (例えば @Destroy など)。 このため、 Seam コンテキストは Seam コンポーネントではないオブジェクトを保持することができ、 Seam にはコンテキストにバインドする非コンポーネントオブジェクトとの作業を簡略化する機能が複数備わっています。
ファクトリコンポーネントパターン により Seam コンポーネントをコンポーネントではないオブジェクトに対してインスタンス化を行う機能として動作させることができます。 ファクトリメソッド はコンテキスト変数が参照されると呼び出されますが、 バインドされた値は持っていません。 @Factory アノテーションを使用してファクトリメソッドを定義します。 ファクトリメソッドは値をコンテキスト変数にバインドし、 バインドした値のスコープを決定します。ファクトリメソッドのスタイルは 2 種類あります。 最初のスタイルは Seam によりコンテキストにバインドされる値を返します。
@Factory(scope=CONVERSATION) 
public List<Customer> getCustomerList() { 
  return ... ; 
}
Copy to Clipboard Toggle word wrap
2 番目のスタイルは、 値をコンテキスト変数自体にバインドする void タイプのメソッドです。
@DataModel List<Customer> customerList; 
@Factory("customerList") 
public void initCustomerList() { 
  customerList = ...  ; 
}
Copy to Clipboard Toggle word wrap
どちらの場合も、 customerList コンテキスト変数が参照されその値が null になるとファクトリメソッドが呼び出されます。 ファクトリメソッドはその値のライフサイクルではこれ以上何も持っていません。 さらに強力なパターンは マネージャコンポーネントパターン です。 この場合、 コンテキスト変数にバインドする Seam コンポーネントがコンテキスト変数の値を管理し、 残りはクライアントから見えません。
マネージャコンポーネントとは @Unwrap メソッドを持つあらゆるコンポーネントです。 このメソッドはクライアント側から見える値を返し、 コンテキスト変数が参照されるたびに呼び出されます。
@Name("customerList") 
@Scope(CONVERSATION) 
public class CustomerListManager { 
  ... 
  @Unwrap 
  public List<Customer> getCustomerList() { 
    return ... ; 
  } 
}
Copy to Clipboard Toggle word wrap
マネージャコンポーネントパターンはコンポーネントのライフサイクルにより制御を必要とする場合に特に便利です。 例えば、 コンテキスト終了時にクリーンアップを必要とする重量オブジェクトがある場合、 オブジェクトを @Unwrap してマネージャコンポーネントの @Destroy メソッドでクリーンアップを実行することが可能です。
@Name("hens") 
@Scope(APPLICATION)
public class HenHouse { 
  Set<Hen> hens;
  
  @In(required=false) Hen hen; 
  
  @Unwrap 
  public List<Hen> getHens() 
  { 
    if (hens == null) { 
      // Setup our hens } 
    return hens; 
  } 
  
  @Observer({"chickBorn", "chickenBoughtAtMarket"}) 
  public addHen() { 
    hens.add(hen); 
  } 
  
  @Observer("chickenSoldAtMarket") 
  public removeHen() { 
    hens.remove(hen); 
  } 
  
  @Observer("foxGetsIn") 
  public removeAllHens() { 
    hens.clear(); 
  } 
  
  ... 
}
Copy to Clipboard Toggle word wrap
ここでは基礎をなすオブジェクトに変更を加える多くのイベントを管理コンポーネントが監視しています。 コンポーネントはこうした動作自体を管理し、 オブジェクトはアクセスされるたびにアンラップされるため、 一貫性のあるビューが提供されます。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2025 Red Hat