26.4. Seam スコープの Spring Bean
Seam 統合パッケージでは Seam のコンテキストを Spring 2.0 スタイル カスタムなスコープ として使用することもできます。 これによりいずれの Seam コンテキスト内でもあらゆる Spring Bean を宣言することができます。ただし、 Spring のコンポーネントモデルはステートフル性に対応するようには設計されていなかったため、 この機能を使用する場合は十分に気を付けてください。 特に、 セッションスコープや対話スコープの Spring Bean のクラスタ化には問題があるため、 広いスコープの Bean やコンポーネントを狭いスコープの Bean にインジェクトする場合は注意が必要です。
Spring Bean ファクトリの設定で
<seam:configure-scopes/> を指定し、 すべての Seam スコープがカスタムスコープとして Spring Bean に利用できるようにします。 Spring Bean を特定の Seam スコープに関連付けるには、 Bean 定義の scope 属性で目的のスコープを指定します。
configure-scopes 定義内の prefix 属性を指定することによって、 スコープ名のプレフィックスを変更することができます (デフォルトのプレフィックスは seam. です)。
デフォルトではこの方法で登録される Spring コンポーネントのインスタンスは
@In を使って参照される場合に自動的に作成されません。 インスタンスを自動作成させるには、インジェクションポイントで @In(create=true) を指定するか (特定の Bean を自動作成するため)、 configure-scopes の default-auto-create 属性を使って Seam スコープの Spring Bean がすべて自動作成されるようにします。
後者の方法では Seam スコープの Spring Bean を
<seam:instance/> を使わずに他の Spring Bean にインジェクトすることができます。 ただし、スコープインピーダンスには十分注意する必要があります。 一般的には Bean 定義内で <aop:scoped-proxy/> を指定しますが、 Seam スコープの Spring Bean は <aop:scoped-proxy/> との互換性がありません。 したがって、Seam スコープ Spring Bean をシングルトンにインジェクトする場合は <seam:instance/> を使用してください。