< 上一课 | 下一课 >

课程 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 概要文件
  5. 确保 CounterApp 显示在应用程序项目字段中,然后单击完成

将服务添加至捆绑软件

在本课程中,您将创建一个简单服务 World,该服务会从 World.getText() 方法返回一个文本字符串。
  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 接口,然后单击确定
    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,然后单击确定。这时,会将 Bean 添加至配置。
    3. 配置 Bean:
      • 标识字段中,输入 WorldBean
      • 字段中,单击浏览。这时,将打开“选择类型”对话框。在选择类型名称字段中,输入 WorldImpl,然后选择 WorldImpl 类。单击确定
      • 初始化方法字段中,输入 init
    4. 单击蓝图,然后单击添加。这时,将打开“添加项目”对话框。
    5. 单击服务,然后单击确定。这时,会将服务添加至配置。
    6. 配置服务:
      • 标识字段中,输入 WorldService
      • 接口字段中,单击浏览,然后选择 World 接口。
      • 引用字段中,单击浏览,然后选择 Bean:WorldBean。单击确定
    7. 保存文件。
  6. 导出软件包:
    1. 展开 CounterWorldBundle,然后双击清单:CounterWorldBundle 以在编辑器中打开捆绑软件清单文件。
    2. 选择运行时选项卡。
    3. 在编辑器的“导出的软件包”部分中,单击添加。这时,将打开“导出的软件包”对话框。
    4. 从软件包列表中单击 com.ibm.ws.eba.world,然后单击确定
    5. 保存捆绑软件清单文件。

更新 Bean 以使用新服务

实现 World 服务之后,您需要更新 GreetImpl Bean 和 CounterServiceBundle 捆绑软件清单文件以使用 World 服务。
  1. 导入软件包:
    1. 在“企业资源管理器”中,展开 CounterServiceBundle,然后双击清单:CounterServiceBundle 以在编辑器中打开捆绑软件清单文件。
    2. 选择依赖关系选项卡。
    3. 在编辑器的“导入的软件包”部分中,单击添加。这时,将打开“导入的软件包”对话框。
    4. 从软件包列表中单击 com.ibm.ws.eba.world,然后单击确定
    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. 单击引用,然后单击确定。这时,将打开“引用详细信息”对话框。
  4. 配置引用:
    • 引用标识字段中,输入 WorldRef
    • 引用接口字段中,单击浏览,然后选择您创建的 World 接口。单击确定
    • 单击确定以接受更改并关闭对话框。
    这时,会将该引用添加至蓝图文件。
  5. 在“概述”部分中,单击 GreetBean (Bean) 节点,然后单击添加。这时,将打开“添加项目”对话框。
  6. 单击属性,然后单击确定。这时,会将属性添加至配置。
  7. 配置属性:
    • 名称字段中,输入 worldBean
    • 引用字段中,单击浏览。这时,将打开“选择引用”对话框。单击引用:WorldRef,然后单击确定
  8. 保存文件。

部署应用程序

  1. 在“企业资源管理器”中,展开 CounterWebBundle > CounterWebBundle > Servlet
  2. 右键单击 CounterServlet,然后选择运行方式 > 在服务器上运行。这时,“在服务器上运行”对话框将打开。
  3. 单击完成

字符串 greet.getText()=0 Hello World! 将显示在浏览器中。每次重新装入该页面,该值都会增加。

切换至“控制台”视图(窗口 > 显示视图 > 控制台)以查看来自服务器的输出。根据蓝图文件中 CounterImplGreetImplWorldImpl 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 的服务。

在本课程中,您了解如何使用蓝图引用来配置跨捆绑软件依赖关系注入。
< 上一课 | 下一课 >
指示主题类型的图标 教程课程主题
信息中心的条款和条件 | 反馈

时间戳记图标 最近一次更新时间: 2014 年 4 月 17 日

文件名:counter_lesson8.html