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のコンテキストは簡単に拡張できるということです。後は、アイディア次第。
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のコンテキストは簡単に拡張できるということです。後は、アイディア次第。