Java EE 6では、サーブレットコンテナ、EJBコンテナとは別に「Web Beansコンテナ」と呼ばれるコンテナが搭載される予定だ。Web Beansコンテナは、POJOやEJBを同格の「Web Beansコンポーネント」として扱い、DIやインターセプタ、イベントのルーティングなどの高度な機能を提供する。

コンポーネントの定義方法

最も単純なWeb Beansコンポーネントはリスト1のようになる。

リスト1 GoodMorning.java

    @Component
    public class GoodMorning {
      public String getGreetingMessage() {
       return "Good morning";
      }
    }

「@Component」アノテーションがポイントだ。なんとコンポーネントの定義は、アノテーションをクラスに付与するだけでできてしまう。

@Componentは「ステレオタイプ」と呼ばれる種類のアノテーションだ。ステレオタイプは@Componentの他にも存在するし、自分で定義することもできる。Web Beansコンテナは、ステレオタイプが付与されたクラスを「コンポーネント」として自身に登録する。(ステレオタイプの詳細は後述)

インジェクション

Web Beansコンテナの主な役割は、コンポーネント間の依存性を解決し、DIを行うことだ。リスト2に示すのは、リスト1の「GoodMorning」クラスをインジェクトする例。

リスト2 GreetingPrinter

    @Component
    public class GreetingPrinter {
      // @Inアノテーションを使用
      @In GoodMorning goodMorning;

      public void print(String name) {
        System.out.println(goodMorning.getGreetingMessage());
      }
    }

インジェクトの対象に@Inアノテーションを付与するだけだ。インジェクトはフィールド、メソッド、コンストラクタを対象に行うことができる。

たとえば、リスト1のサンプルをsetterメソッドを使用するようにするとリスト3のようになる。

リスト3

    @Component
    public class GreetingPrinter {
      GoodMorning goodMorning;

      @In
      public void setGoodMorning(GoodMorning goodMorning) {
        this.goodMorning = goodMorning;
      }
      ...(略)...
    }

ここで気づいていただきたいのは、このインジェクションが「GoodMorning」と言う型によって行われることだ。「コンポーネントの名前を表す文字列」などではない。あくまで型のみが依存性解決の情報となっている、というのが非常に重要だ。