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」と言う型によって行われることだ。「コンポーネントの名前を表す文字列」などではない。あくまで型のみが依存性解決の情報となっている、というのが非常に重要だ。