< 上一课 | 下一课 >

课程 6:在捆绑软件内添加依赖关系注入

依赖关系注入允许一个 Bean 访问另一个 Bean,而不必实现任何代码以创建 Bean 实例。 所需的 Bean 实例由蓝图容器通过使用包含在蓝图配置文件中的信息进行创建。

在开始本课程之前,请先停止服务器。 在“服务器”视图(窗口 > 显示视图 > 服务器)中,右键单击 WebSphere Application Server,然后选择停止
要在捆绑软件内添加依赖关系注入,请执行下列操作:
  1. 将服务添加至捆绑软件
  2. 更新蓝图配置文件
  3. 更新 Servlet 以调用新服务
  4. 部署应用程序

将服务添加至捆绑软件

  1. 创建接口类:
    1. 在“企业资源管理器”中,展开 CounterServiceBundle > src
    2. 右键单击 com.ibm.ws.eba.counter,然后选择新建 > 接口。这时,将打开“新建 Java™ 接口”向导。
    3. 名称字段中,输入 Greet,然后单击完成。这时将在软件包中创建接口,并在编辑器打开该接口。
    4. getText() 原型添加至该接口。以下代码就是结果:
      package com.ibm.ws.eba.counter;
      
      public interface Greet {
      		public String getText();
      }
  2. 创建实现类:
    1. 右键单击 com.ibm.ws.eba.counter,然后选择新建 > 。这时,将打开“新建 Java 类”向导。
    2. 名称字段中,输入 GreetImpl
    3. 在“接口”列表旁边,单击添加。这时,将打开“选择已实现的接口”对话框。
    4. 选择接口字段中,输入 Greet。选择 Greet 接口,然后单击确定
    5. 单击完成。这时将在软件包中创建类,并在编辑器打开该类。
    6. GreetImpl 类替换为以下实现:
      package com.ibm.ws.eba.counter;
      
      public class GreetImpl implements Greet {
      	
      	private Counter counter;
      	
      	public void setCounter(Counter c) {
      		counter = c;
      	}
      
      	@Override
      	public String getText() {
      		return counter.getCount()+" Hello";
      	}
      	
      	public void init() {
      		System.out.println("GreetImpl.init() called");
      	}
      
      }
    7. 保存 GreetImpl.java
专用变量 counter 是对由容器通过使用依赖关系注入进行初始化的 Counter 服务实例的引用。使用 setCounter 方法对其进行设置。

更新蓝图配置文件

执行下列步骤来配置蓝图配置文件以启动 Greet 服务并注入 Counter 服务的实例:
  1. 在“企业资源管理器”中,右键单击 CounterServiceBundle,然后选择 OSGi > 打开蓝图文件以在编辑器中打开蓝图文件。
  2. 将组件组合件和配置信息添加至蓝图配置文件:
    1. 在编辑器的“设计”选项卡中,选择蓝图,然后单击添加。这时,将打开“添加项目”对话框。
    2. 单击 Bean,然后单击确定。这时,将打开“Bean 详细信息”对话框。
    3. 配置 Bean:
      1. Bean 标识字段中,输入 GreetBean
      2. 字段中,单击浏览。这时,将打开“选择类型”对话框。在选择类型名称字段中,输入 GreetImpl,然后选择 GreetImpl 类。单击确定
      3. 单击确定以接受更改并关闭对话框。
      4. 在编辑器中的初始化方法字段内,输入 init
      这时,会将 Bean 添加至蓝图文件。
    4. 在“概述”部分中,单击 GreetBean (Bean),然后单击添加。这时,将打开“添加项目”对话框。
    5. 单击属性,然后单击确定
    6. 配置属性:
      • 名称字段中,输入 counter
      • 引用字段中,单击浏览。这时,将打开“选择引用”对话框。单击 Bean:CounterBean,然后单击确定
    7. 在“概述”部分中,单击蓝图,然后单击添加
    8. 单击服务,然后单击确定。这时,将打开“服务详细信息”对话框。
    9. 配置服务:
      1. 服务接口字段中,单击浏览,然后选择 Greet 接口。
      2. Bean 引用字段中,单击浏览,然后选择 Bean:GreetBean。单击确定
      3. 单击确定以接受更改并关闭对话框。
      这时,会将服务添加至配置。
  3. 保存文件。

更新 Servlet 以调用新服务

  1. 在“企业资源管理器”中,展开 CounterWebBundle > Java Resources > src > com.ibm.ws.eba.servlet
  2. 双击 CounterServlet.java 以在编辑器中打开它。
  3. 找到 doGet() 方法并将其替换为以下实现:
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		Greet greet;
    		try {
    			InitialContext ic = new InitialContext();
    			greet = (Greet) ic.lookup("osgi:service/"+Greet.class.getName());
    			response.getOutputStream().println("greet.getText()="+greet.getText());
    		} catch (NamingException e) {
    	e.printStackTrace();
    		}
    	}
  4. 在主菜单中,单击源代码 > 组织导入。这时,将更新 import 语句。
  5. 保存 CounterServlet.java

部署应用程序

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

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

切换至“控制台”视图(窗口 > 显示视图 > 控制台)以查看来自服务器的输出。根据蓝图文件中 CounterImplGreetImpl Bean 的初始化方法条目,成功的结果将显示来自 CounterImpl.init()GreetImpl.init() 的输出:
[3/30/10 16:59:41:734 EDT] 00000072 StepStartBLA  A   CWWMH0300I: Starting business-level application "WebSphere:blaname=CounterApp".
[3/30/10 16:59:42:406 EDT] 00000072 webapp        I com.ibm.ws.webcontainer.webapp.WebGroupImpl WebGroup SRVE0169I: Loading Web Module: CounterWebBundle.
[3/30/10 16:59:42:453 EDT] 00000072 WASSessionCor I SessionContextRegistry getSessionContext SESN0176I: Will create a new session context for application key default_hostCounterWebBundle
[3/30/10 16:59:42:468 EDT] 00000072 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/30/10 16:59:42:468 EDT] 00000072 FileLocatorIm E   CWPST0164E: The CounterWebBundle composition unit is not found.
[3/30/10 16:59:42:500 EDT] 00000072 StepStartBLA  A   CWWMH0196I: Business-level application "WebSphere:blaname=CounterApp" was started successfully.
[3/30/10 16:59:42:500 EDT] 00000016 SystemOut     O CounterImpl.init() called
[3/30/10 16:59:42:500 EDT] 00000016 SystemOut     O GreetImpl.init() called
注: 如果来自 CounterImpl.init()GreetImpl.init() 的输出未显示在控制台输出中,请检查应用程序部署或启动期间错误消息的输出,然后在蓝图文件中检查 Bean 和服务定义中可能存在的错误。

课程复习要点

您了解如何使用蓝图依赖关系注入来允许一个 Bean 使用另一个 Bean 的服务。

在本课程中,您学习了以下主题:
  • 如何为使用另一个 Bean 的 Bean 编写代码。
  • 如何定义蓝图配置文件中用于指示蓝图容器使用依赖关系注入来初始化变量的属性。
< 上一课 | 下一课 >
指示主题类型的图标 教程课程主题
信息中心的条款和条件 | 反馈

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

文件名:counter_lesson7.html