コンテキストと依存性の注入およびJSF 2.0の開始

執筆: Andy Gibson、管理: Troy Giunipero

このページの内容は、NetBeans IDE 7.1、7.2および7.3に適用されます

JSR-299で指定されているコンテキストと依存性の注入(CDI: Contexts and Dependency Injection)はJava EE 6の不可欠な部分であり、サーブレット、エンタープライズBean、JavaBeansなどのJava EEコンポーネントが、アプリケーションのライフサイクル内で明確なスコープを持って存在できるようにするためのアーキテクチャを提供します。また、CDIサービスによって、EJBセッションBeanやJSF (JavaServer Faces)管理対象BeanなどのJava EEコンポーネントが注入可能になり、イベントの起動や監視による疎結合方式の対話が可能になります。

このチュートリアルは、Andy Gibson氏によって投稿されたGetting Started with JSF 2.0 and CDI in JEE 6というタイトルのブログをベースにしています。ここでは、IDEを使用して、JSF 2.0およびCDIをサポートするJava Webプロジェクトを設定する方法を示します。そしてCDI管理対象BeanをFaceletsページに接続する方法を示し、最後にEJBテクノロジとのCDI統合の簡単な例を示します。

NetBeans IDEは、コンテキストと依存性の注入のサポートを組込みでサポートしています。これには、プロジェクト作成時にbeans.xml CDI構成ファイルを生成するオプション、注釈のためのエディタおよびナビゲーション・サポート、一般的に使用されるCDIアーティファクトを作成するための各種ウィザードなどが含まれています。


このチュートリアルを完了するには、次のソフトウェアとリソースが必要です。

ソフトウェアまたはリソース 必須バージョン
NetBeans IDE 7.1、7.2、7.3、Java EEバンドル版
Java Development Kit (JDK) バージョン6
GlassFishサーバー Open Source Edition 3.x

注意:

  • NetBeans IDEのJavaバンドル版には、Java EE 6準拠のコンテナであるGlassFish Server Open Source Edition 3.xも含まれています。
  • CDIのサポートは、パッチ1を経由すればNetBeans 6.8でも使用できます。

CDIをサポートするJava Webプロジェクトの作成

この課題では、CDIをサポートするJSF 2.0対応のJava Webプロジェクトを作成します。

  1. IDEのメイン・ツールバーにある「新規プロジェクト」(「新規プロジェクト」ボタン)ボタンをクリックします([Ctrl]-[Shift]-[N]、Macの場合は[⌘]-[Shift]-[N])。
  2. 新規プロジェクト・ウィザードで、「Java Web」カテゴリを選択してから「Webアプリケーション」を選択します。「次」をクリックします。
  3. プロジェクト名として「cdiDemo」と入力し、プロジェクトの場所を設定します。「次」をクリックします。
  4. サーバーをGlassFish 3.xに設定し、Java EEバージョンをJava EE 6 Webに設定します。「コンテキストと依存性の注入を有効にする」オプションが選択されていることを確認します。
    新規Webアプリケーション・ウィザードに用意されているCDIオプションの有効化
    「コンテキストと依存性の注入を有効にする」オプションが選択されると、プロジェクト・テンプレートの作成時に、プロジェクトのWEB-INFフォルダにbeans.xmlファイルが生成されます。beans.xmlファイルはCDIによって使用され、プロジェクトがCDI Beanを含むモジュールであることをJava EE準拠のサーバーに伝えます。
  5. 「次」をクリックします。
  6. 「フレームワーク」パネルで「JavaServer Faces」オプションを選択します。
  7. 「構成」タブをクリックし、「優先ページ言語」として「Facelets」が選択されていることを確認します。「終了」をクリックします。

    「終了」をクリックすると、IDEはWebアプリケーション・プロジェクトを生成し、index.xhtml開始ページがエディタに表示されます。

  8. 「プロジェクト」ウィンドウで「Webページ」>「WEB-INF」フォルダ・ノードを展開すると、beans.xmlファイルが表示されます。現時点でこのファイルは空ですが、注釈の代替として、XMLでBeanの関連情報を指定するために使用できます。
    「プロジェクト」ウィンドウに表示された新しいプロジェクト

    「ライブラリ」>「GlassFish Server」ノードを展開すると、weld-osgi-bundle.jarライブラリが自動的に追加されていることがわかります。GlassFish Serverには、JSR-299 CDI仕様のJBossの実装であるWeldが含まれています。

JSFの式言語からのBeanへのアクセス

この課題では、EL構文を使用してCDI管理対象BeanをFaceletsページに接続する方法を示します。

  1. 「プロジェクト」ウィンドウで「ソース・パッケージ」ノードを右クリックし、「新規」>「Javaクラス」を選択します。
  2. 新規Javaクラス・ウィザードで、「クラス名」に「MessageServerBean」、「パッケージ」に「exercise1」と入力します。(ウィザードの完了時に新しいパッケージが作成されます。)
    新規Javaクラス・ウィザード
  3. 「終了」をクリックします。新しいパッケージおよびクラスが生成され、エディタでクラスが開きます。
  4. javax.inject.Named注釈でクラスに注釈を付けて、文字列を返す単一のメソッドを作成します。
    package exercise1;
    
    import javax.inject.Named;
    
    @Named
    public class MessageServerBean {
    
        public String getMessage() {
            return "Hello World!";
        }
    }
    @Named注釈の入力中に[Ctrl]-[Space]を押すと、エディタのコード補完サポートとJavadocドキュメントを呼び出せます。エディタのコード補完機能を使用して注釈を適用する(適切な注釈を選択して[Enter]を押す)と、自動的にimport文がファイルに追加されます。

    Javadocのポップアップで「外部Webブラウザにドキュメントを表示」(「外部Webブラウザにドキュメントを表示」ボタン)ボタンをクリックし、別個のウィンドウにフルサイズのJavadocを表示することもできます。
  5. ファイルを保存します([Ctrl]-[S]、Macの場合は[⌘]-[S])。@Named注釈を追加することで、CDIで定義されているようにMessageServerBeanクラスは管理対象Beanになります。
  6. エディタで([Ctrl]-[Tab]を押して) index.xhtml Faceletsページに切り替え、<h:body>タグに次の内容を追加します。
    <h:body>
        Hello from Facelets
        <br/>
        Message is: #{messageServerBean.message}
        <br/>
        Message Server Bean is: #{messageServerBean}
    </h:body>
    EL式で[Ctrl]-[Space]を押すと、コード補完の候補を利用できます。エディタのコード補完によって、管理対象Beanおよびそのプロパティが一覧表示されます。MessageServerBeanクラスは@Named注釈によってCDI管理対象Beanに変換されるため、JSF管理対象Beanと同じようにEL構文内でアクセスできるようになります。
    新規Javaクラス・ウィザード
  7. IDEのメイン・ツールバーにある「プロジェクトの実行」(「プロジェクトの実行」ボタン)ボタンをクリックします。プロジェクトがコンパイルされてGlassFishにデプロイされ、アプリケーションの開始ページ(index.xhtml)がブラウザで開きます。「Hello World!」メッセージがMessageServerBeanによってページに表示されます。
    ブラウザに表示された開始ページ
  8. メッセージBeanに戻って、メッセージを何か他のもの(「Hello Weld!」など)に変更します。ファイルを保存([Ctrl]-[S]、Macの場合は[⌘]-[S])してからブラウザをリフレッシュします。新しいメッセージが自動的に表示されます。IDEの「保存時にデプロイ」機能によって、保存した変更はすべて自動的にコンパイルされてサーバーに再デプロイメントされます。

    ページの3行目から、クラス名がexercise1.MessageServerBeanであることが確認できます。このBeanは単なるPOJO (Plain Old Java Object)であることに注目してください。Java EEで開発しているにもかかわらず、トランザクションやインターセプタなどが複数のレイヤーに重なった複雑なクラス階層は必要ありません。

仕組み

アプリケーションがデプロイされるとき、beans.xmlファイルの存在によってモジュールにCDI管理対象Beanが含まれていることが示されるため、パス上のクラスに対してCDI注釈のスキャンが行われます。CDIモジュールでは、すべてのBeanはWeldに登録され、@Named注釈を使用してBeanが注入ポイントと照合されます。index.xhtmlページがレンダリングされたとき、JSFは、JSFに登録された式リゾルバを使用してページのmessageServerBeanの値を解決しようとしました。このうちの1つが、messageServerBeanという名前で登録されたMessageServerBeanクラスを持つWeld ELリゾルバです。@Named注釈で別の名前を指定することもできましたが、指定しなかったため、クラス名の最初の文字を小文字にしたデフォルト名で登録されました。Weldリゾルバは、JSFからのリクエストに応じてこのBeanのインスタンスを返します。EL式を使用する場合にのみBeanを命名する必要があります。CDIではクラスの型と修飾子注釈を使用することで、型を保証して注入できるため、注入の機構としてBeanの命名を使用しないでください。


EJBへのアップグレード

Java EEのスタックを使用しているため、EJB 3.1のおかげで少し変更を加えるのみでBeanをEJBとして簡単にデプロイできます。

  1. MessageServerBeanを開き、クラス・レベルでjavax.ejb.Stateless注釈を追加して、文字列を「Hello EJB!」に変更します。
    package exercise1;
    
    import javax.ejb.Stateless;
    import javax.inject.Named;
    
    /**
     *
     * @author nbuser
     */
    @Named
    @Stateless
    public class MessageServerBean {
    
        public String getMessage() {
            return "Hello EJB!";
        }
    }
  2. ファイルを保存([Ctrl]-[S]、Macの場合は[⌘]-[S])してからブラウザに移動してリフレッシュします。次のような出力が表示されます。
    ブラウザに表示されたEJBの詳細
    驚くことに、ただ1つの注釈でPOJOが各種機能を備えたEJBに変わりました。変更を保存してからページをリフレッシュすると、変更した内容が表示されました。これを行うために、独特のプロジェクト構成、ローカル・インタフェース、または難解なデプロイメント・ディスクリプタは一切必要ありませんでした。

異なるEJBのタイプ

@Stateful注釈を使用することもできます。または、シングルトン・インスタンスのための新しい@Singleton注釈を試すこともできます。そうすると、javax.ejb.Singletonjavax.inject.Singletonの2つの注釈があることに気付くでしょう。なぜシングルトンが2つあるのでしょうか。EJB以外の環境でCDIを使用している場合、CDIのシングルトン(javax.inject.Singleton)を使用してEJBの外部でシングルトン・インスタンスを定義できます。EJBのシングルトン(javax.ejb.Singleton)は、トランザクション管理などのEJBの機能をすべて提供します。つまり、必要に応じて、またはEJB作業環境の有無に応じて選択できるようになっています。


関連項目

このシリーズの次回ではCDI注入に焦点をあて、Java EE 6環境での依存性の管理のためにCDIを使用する方法について詳しく見ていきます。

CDIおよびJSF 2.0の詳細は、次のリソースを参照してください。

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2013, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo