Porting the ViewScoped JSF annotation to CDI;

この 記事は、CDI (Contexts and Dependency Injection)のportable extension SPIを使ってViewScopedというスコープを追加する方法を説明しています。

CDI仕様では次の4種類のスコープを提供しています。

  • @RequestScoped
  • @SessionScoped
  • @ApplicationScoped
  • @ConversationScoped

Seamでは、これらに加えてPageスコープとBusiness Processスコープを提供していましたが、CDIではこれらは標準のスコープとしては定義されていません。なぜなら、PageスコープはJSFに依存しますし、Business ProcessスコープはjBPMに依存するからです。このような個別のテクノロジーに依存するスコープはSPIによってコンテキストを追加することができます。実際、Seam3ではこれらはCDI上の拡張モジュールとして提供される予定です。

さて、ViewScopedの記事に戻って拡張モジュールの実装を確認してみると、独自のスコープを追加するためのportable extentionモジュールは次のようになっています:

public class ViewContextExtension implements Extension{

    public void afterBeanDiscovery(@Observes AfterBeanDiscovery event, BeanManager manager) {
        event.addContext(new ViewContext());
    }
}

このViewContextExtentionはCDIコンテナからのAfterBeanDiscoveryイベントを受けて、ViewContextコンテキストを登録します(AfterBeanDiscoveryはCDIコンテナの起動時に発行されるイベントの一つです)もちろん、ViewScopedというアノテーションやViewContextというコンテキストは定義する必要がありますが、CDIコンテナに登録するためのコードは上の部分だけになります。そう、この記事からわかることは、CDIのコンテキストは簡単に拡張できるということです。後は、アイディア次第。