< 前へ | 次へ >

演習 7: バンドル間での依存関係注入の追加

前の演習では、バンドル内で依存関係注入を使用する方法について学習しました。バンドル間で依存関係注入を行う場合は、ブループリント構成ファイル内に余分の参照項目が必要です。

この演習を始める前に、サーバーを停止します。「サーバー」ビュー (「ウィンドウ」 > 「ビューの表示」 > 「サーバー」) で、「WebSphere Application Server」を右クリックしてから、「停止」を選択します。

バンドル・プロジェクトの作成

バンドル・プロジェクトを作成して OSGi アプリケーション・プロジェクトに追加するには、以下のようにします。
  1. 「ファイル」 > 「新規」 > 「その他」をクリックして、OSGi を展開します。
  2. OSGi バンドル・プロジェクト」をクリックして、「次へ」をクリックします。 「新しい OSGi バンドル・プロジェクト」が開きます。
  3. 「プロジェクト名」 フィールドに CounterWorldBundle と入力します。
  4. 「ターゲット・ランタイム」リストから以下のいずれかのサーバーを選択します。
    • WebSphere Application Server v7.0
    • WebSphere Application Server v8.0
    • WebSphere Application Server v8.5
    • WebSphere Application Server V8.5 Liberty Profile
  5. CounterApp が「アプリケーション・プロジェクト」フィールドに表示されることを確認し、「終了」をクリックします。

バンドルへのサービスの追加

この演習では、メソッド World.getText() からテキスト・ストリングを戻す単純なサービス World を作成します。
  1. パッケージを以下のように作成します。
    1. エンタープライズ・エクスプローラーで、「CounterWorldBundle」を展開します。
    2. src」を右クリックしてから、「新規」 > 「パッケージ」を選択します。「新規 Java™ パッケージ」ウィザードが開きます。
    3. 「名前」フィールドに com.ibm.ws.eba.world と入力し、「終了」をクリックします。src フォルダーにパッケージが作成されます。
  2. インターフェース・クラスを以下のように作成します。
    1. パッケージ「com.ibm.ws.eba.world」を右クリックしてから、「新規」 > 「インターフェース」をクリックします。「新規 Java インターフェース」ウィザードが開きます。
    2. 「名前」フィールドに World と入力し、「終了」をクリックします。インターフェースがパッケージに作成され、エディターで開きます。
    3. getText() メソッドをインターフェースに追加します。 結果は、次のコードのようになります。
      package com.ibm.ws.eba.world;
      
      public interface World {
      	public String getText();
      }
    4. World.java を保存します。
  3. 実装クラスを以下のように作成します。
    1. パッケージ「com.ibm.ws.eba.world」を右クリックしてから、「新規」 > 「クラス」をクリックします。「新規 Java クラス」ウィザードが開きます。
    2. 「名前」フィールドに WorldImpl と入力します。
    3. 「インターフェース」リストの横の「追加」をクリックします。「実装されたインターフェースの選択」ダイアログが開きます。
    4. 「インターフェースの選択」フィールドに World と入力します。com.ibm.ws.eba.world の「World」 インターフェースを選択してから、「OK」をクリックします。
    5. 「終了」をクリックします。クラスがパッケージに作成され、エディターで開きます。
    6. getText() メソッドの実装を追加します。 サービスがサーバーで始動することを確認する初期化メソッドを追加します。 結果は、次のコードのようになります。
      package com.ibm.ws.eba.world;
      
      public class WorldImpl implements World {
      
        @Override
        public String getText() {
          return " World!";
        }
      		
        public void init() {
         System.out.println("WorldImpl.init() called.");
        }
      }
    7. WorldImpl.java を保存します。
  4. ブループリント構成ファイルを以下のように作成します。
    1. プロジェクト「CounterWorldBundle」を右クリックして、「新規」 > 「その他」 > 「OSGi」 > 「ブループリント・ファイル」を選択してから「次へ」をクリックします。
    2. 「終了」をクリックします。ブループリント構成ファイルがエディターで開きます。
  5. 以下のように、コンポーネント・アセンブリーおよび構成情報をブループリント構成ファイルに追加します。
    1. エディターの「設計」タブで、「追加」をクリックします。「項目の追加」ダイアログが開きます。
    2. Bean」をクリックして、 「OK」をクリックします。 Bean が構成に追加されました。
    3. Bean を構成します:
      • 「ID」フィールドに WorldBean と入力します。
      • 「クラス」フィールドで、「参照」をクリックします。「型の選択」ダイアログが開きます。「型名の選択」フィールドに WorldImpl と入力してから、「WorldImpl」クラスを選択します。「OK」をクリックします。
      • 「初期化メソッド」フィールドに init と入力します。
    4. ブループリント」をクリックしてから、「追加」をクリックします。 「項目の追加」ダイアログが開きます。
    5. サービス」をクリックして、 「OK」をクリックします。 サービスが構成に追加されました。
    6. サービスを構成します:
      • 「ID」フィールドに WorldService と入力します。
      • インターフェース」フィールドで、「参照」をクリックして「World」インターフェースを選択します。
      • 参照」フィールドで、「参照」をクリックしてから、「Bean: WorldBean」を選択します。「OK」をクリックします。
    7. ファイルを保存します。
  6. パッケージを以下のようにエクスポートします。
    1. CounterWorldBundle」を展開して「Manifest: CounterWorldBundle」をダブルクリックして、バンドル・マニフェスト・ファイルをエディターで開きます。
    2. ランタイム」タブを選択します。
    3. エディターの「エクスポートするパッケージ」セクションで、「追加」をクリックします。 「エクスポートするパッケージ」ダイアログが開きます。
    4. パッケージ・リストから「com.ibm.ws.eba.world」をクリックし、「OK」をクリックします。
    5. バンドル・マニフェスト・ファイルを保存します。

新規サービスを使用するための Bean の更新

World サービスを実装したので、このサービスを使用するには、GreetImpl bean および CounterServiceBundle バンドル・マニフェスト・ファイルを更新する必要があります。
  1. パッケージを以下のようにインポートします。
    1. エンタープライズ・エクスプローラーで、「CounterServiceBundle」を展開して「Manifest: CounterServiceBundle」をダブルクリックし、バンドル・マニフェスト・ファイルをエディターで開きます。
    2. 従属関係」タブを選択します。
    3. エディターの「インポートするパッケージ」で、「追加」をクリックします。 「インポートするパッケージ」ダイアログが開きます。
    4. パッケージ・リストから「com.ibm.ws.eba.world」をクリックし、「OK」をクリックします。
    5. バンドル・マニフェスト・ファイルを保存します。
  2. GreetImpl.java を以下のように更新します。
    1. エンタープライズ・エクスプローラーで、「CounterServiceBundle」 > 「src」 > 「com.ibm.ws.eba.counter」を展開して「GreetImpl.java」をダブルクリックし、ファイルをエディターで開きます。
    2. 以下の変数宣言を追加し、World bean のメソッドを設定します。
      private World worldBean;
      public void setWorldBean(World b)
      {
        worldBean = b;
      }
    3. メインメニューで、「ソース」 > 「インポートの編成」をクリックします。欠落している import ステートメントがコードに追加されます。
    4. getText() メソッドを更新して新規サービスを呼び出します。
      public String getText(){
        return counter.getCount()+" Hello"+worldBean.getText();
      }
    5. ファイルを保存します。
    結果は、次のコードのようになります。
    package com.ibm.ws.eba.counter;
    
    import com.ibm.ws.eba.world.World;
    
    public class GreetImpl implements Greet {
      private World worldBean;
      public void setWorldBean(World b)
      {
        worldBean = b;
      }
    	
      private Counter counter;
    	
      public void setCounter(Counter c) {
        counter = c;
      }
    
      @Override
      public String getText(){
        return counter.getCount()+" Hello"+worldBean.getText();
    }
    	
      public void init() {
        System.out.println("GreetImpl.init() called");
      }
    
    }

ブループリント構成ファイルの更新

ブループリント・コンテナーが World bean のインスタンスを GreetImpl に注入できるように、ブループリント構成ファイルに参照を追加する必要があります。
  1. 「CounterServiceBundle」 > 「BundleContent」 > 「OSGI-INF」 > 「blueprint」を展開してから、「blueprint.xml」をダブルクリックしてブループリント構成ファイルをエディターで開きます。
  2. エディターの「設計」タブで「ブループリント」を選択してから、「追加」 をクリックします。「項目の追加」ダイアログが開きます。
  3. 参照」をクリックして、「OK」をクリックします。 「参照の詳細」ダイアログが開きます。
  4. 参照を構成するには、以下のようにします。
    • 「参照 ID」フィールドに WorldRef と入力します。
    • 「参照インターフェース」フィールドで、「参照」をクリックして、作成した「World」インターフェースを選択します。「OK」をクリックします。
    • 「OK」をクリックして変更を受け入れ、ダイアログを閉じます。
    参照がブループリント・ファイルに追加されました。
  5. 「概要」セクションで、「GreetBean (Bean)」ノードをクリックしてから、「追加」をクリックします。「項目の追加」ダイアログが開きます。
  6. プロパティー」をクリックして、「OK」をクリックします。 プロパティーが構成に追加されました。
  7. プロパティーを以下のように構成します。
    • 「名前」フィールドに worldBean と入力します。
    • 「参照」フィールドで「参照」をクリックします。「参照選択」ダイアログが開きます。「Reference:WorldRef」をクリックして、「OK」をクリックします。
  8. ファイルを保存します。

アプリケーションのデプロイ

  1. エンタープライズ・エクスプローラーで、「CounterWebBundle」 > 「CounterWebBundle」 > 「サーブレット」を展開します。
  2. CounterServlet」を右クリックして、「実行」 > 「サーバーで実行」を選択します。「サーバーで実行」ダイアログが開きます。
  3. 「終了」をクリックします。

ブラウザーに greet.getText()=0 Hello World! というストリングが 表示されます。ページが再ロードされるたびに、値が増加します。

「コンソール」ビューに切り替えて (「ウィンドウ」 > 「ビューの表示」 > 「コンソール」)、サーバーからの出力を表示します。正常に実行された場合、ブループリント・ファイルの CounterImplGreetImpl、および WorldImpl Bean に対する初期化メソッド入り口に基づいて、CounterImpl.init()GreetImpl.init()、および WorldImpl.init() からの出力が以下のように表示されます。
1/10 13:07:26:250 EDT] 000000aa StepStartBLA  A   CWWMH0300I: Starting business-level application "WebSphere:blaname=CounterApp".
[3/31/10 13:07:27:000 EDT] 000000aa webapp        I com.ibm.ws.webcontainer.webapp.WebGroupImpl WebGroup SRVE0169I: Loading Web Module: CounterWebBundle.
[3/31/10 13:07:27:046 EDT] 000000aa WASSessionCor I SessionContextRegistry getSessionContext SESN0176I: Will create a new session context for application key default_hostCounterWebBundle
[3/31/10 13:07:27:062 EDT] 000000aa webcontainer  I com.ibm.ws.wswebcontainer.VirtualHost addWebApplication SRVE0250I: Web Module CounterWebBundle has been bound to default_host[*:9083,*:80,*:9446,*:5067,*:5066,*:443].
[3/31/10 13:07:27:078 EDT] 000000aa FileLocatorIm E   CWPST0164E: The CounterWebBundle composition unit is not found.
[3/31/10 13:07:27:093 EDT] 000000aa StepStartBLA  A   CWWMH0196I: Business-level application "WebSphere:blaname=CounterApp" was started successfully.
[3/31/10 13:07:27:109 EDT] 00000066 SystemOut     O WorldImpl.init() called
[3/31/10 13:07:27:109 EDT] 00000015 SystemOut     O CounterImpl.init() called
[3/31/10 13:07:27:125 EDT] 00000015 SystemOut     O GreetImpl.init() called
注: CounterImpl.init()GreetImpl.init()、 および WorldImpl.init() からの出力がコンソール出力に表示されない場合は、 アプリケーションのデプロイおよび始動時のエラー・メッセージ出力を確認し、Bean およびサービス定義に 考えられるエラーがないかブループリント・ファイルを確認します。

演習のチェックポイント

ブループリント依存関係注入を使用して、ある Bean が別の Bean のサービスを使用できるようにする方法を学習しました。

この演習では、ブループリント参照を使用して、クロス・バンドル依存関係注入を構成する方法について学習しました。
< 前へ | 次へ >
トピックのタイプを示すアイコン チュートリアルの演習のトピック
インフォメーション・センターのご利用条件 | フィードバック

タイム・スタンプ・アイコン 最終更新: May 29, 2014 10:20

ファイル名: counter_lesson8.html