Seam ContextとWebBeans Contextの違い

Seam Contextの延長線上でWebBeans Contextを考えるとわからなくなります。

SeamのContextはコンテキスト変数の名前空間です。要するに名前と値の組がコンテキストというマップに管理されているという感じ。だから、コンポーネントのアクセスは名前がベースになります。Seamの@Outはコンポーネントに限らず、任意をオブジェクトをコンテキストにセットすることが可能でした。

WebBeansでは@Outがありません。このことは、WebBeans ContextをComponent Typeからインスタンスへのマップを定義しているインスタンス管理テーブルと考えるとしっくりします。コンテキストはDIのためのWebBeansコンポーネントのライフサイクルを管理する専用と考えれば、そこに値を書き換える@Outというものは馴染まないのでしょう。

WebBeansで、Seamの@Outのように複数のコンポーネントが参照する値を変更したい場合は、WebBeansではProducer methodを使います。このメソッドはコンポーネントの生成メソッドを定義するものです。これを使えば、このメソッドの実行時に任意をオブジェクトを返すことが可能です。だから、特定のコンポーネントのプロパティ値として状態を保持しておいて、Producer methodで@Inの変数にそのプロパティ値をインジェクトすることができます。

WebBeansのコンテキストはコンポーネントを管理し、WebBeansコンポーネント(ステートフルオブジェクト)は状態を保持する。そういうものだ、と考えると納得できます。