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