Scope Adaptorとは何か

SeamやWebBeansでは、セッションスコープのような広いスコープのコンポーネントに対し、リクエストスコープのような狭いスコープのコンポーネントをインジェクトすることが可能です。

このような場合、セッションスコープは複数のスレッドから参照されますが、リクエストスコープの方は呼び出しスレッド内だけのスコープになります。つまり、呼び出したクライアントによって生成されるインスタンスは異なることになります。同じセッションスコープのコンポーネントにアクセスしているにもかかわらず、より狭いスコープの状態にもアクセスできるのです。

上手い例ではありませんが、アプリケーションスコープのコンポーネントのメソッドが、ログインユーザ名を得たいと思ったら、セッションスコープに格納されているユーザ情報にアクセスする必要があるでしょう。上位のスコープから下位のスコープにアクセスすると便利なシーンは存在すると思います。

で、この実現方法ですが、Seamではインジェクションは動的に発生するので、そのたびにコンテキスト階層を下(狭い方)から上(広い方)に向かって検索していきます。すべてが動的というSeamとは対照的に、WebBeansは普通はデプロイ時に依存性を解決することにして、必要なときだけ動的にするという風になっています。

WebBeans Early DraftのScope Adaptorのところを抜き出してみます。WebBeansではカレントスレッドのインスタンスをカレントインスタンスと呼んでいます。この点を意識して、以下の記述を読んでみてください(ボールド体のところは私が強調するためにつけたのであって、原文ではそうはなっていません)。

3.1.2. Scope adaptors
The Web Beans container must guarantee that when any component instance invokes an injected component instance, the invocation is always processed by the current instance (see Section 5.1, “Contexts”) of the injected component. In certain scenarios, for example if a request scoped component is injected into a session scoped component, this rule requires that the container must inject a scope adaptor object. A scope adaptor implements or extends the type of the injected attribute and delegates all method calls to the current instance of the injected component.

上の例では、Scope AdaptorというProxyがセッションスコープのコンポーネントにインジェクトされ、そのProxyにアクセスしたリクエストのスレッドごとに(リクエストコンテキストの)適切なカレントインスタンスにアクセスできるようにしてくれる、ということだと思います。