使用OSGi构建面向服务的联络管理应用程序

译文
开发 后端
OSGi是一个十分适合SOA的架构,那么,如何使用OSGi构建面向服务的联络管理应用程序?本文通过操作一个最简单的Hello World应用来展示这个过程的实现。

【51CTO精选译文】本文是《你好,OSGi》系列的第八部分。在之前一篇已经使用Spring DM创建了Hello World应用,下面的步骤就是要进行服务套件的导入和导出了。简单来说就是,构建一个面向服务的联络管理应用程序。

51CTO编辑推荐:OSGi入门与实践全攻略

导入和导出服务套件

联络管理(Contact Management)应用程序包含两个套件。第一个套件是 ContactDAO,与数据库进行会话并将 ContactDAO 对象导出为OSGi服务。第二个套件是之前开发的 HelloWorld 应用程序,我们将其扩展,导入 ContactDAO 对象(即被导出的OSGi服务)。

下面让我们先从创建 ContactDAO 套件开始。为了简单易行,我们不会在套件中添加真实的数据库互动逻辑;作为替代,每个方法仅将其方法名称写到 Eclipse 控制台。

首先创建 com.javaworld.sample.osgi.spring.contact.Contact.java 类,用来从 ontactDAO 将数据传递到 HelloWorld  套件。程序如代码清单 3 所示。(Contact.java 是一个简单的类,表示数据库中的一个联络记录。)

代码清单 3. Contact.java

  1. package com.javaworld.sample.osgi.spring.contact;  
  2. public class Contact {  
  3. int contactId;  
  4. String firstName;  
  5. String lastName;  
  6. public int getContactId() {  
  7. return contactId;  
  8. }  
  9. public void setContactId(int contactId) {  
  10. this.contactId = contactId;  
  11. }  
  12. }  
  13.  

下一步,我们来创建 ContactDAO.java 接口,程序如代码清单 4 所示。

代码清单 4. ContactDAO 接口

  1. package com.javaworld.sample.osgi.spring.contact;  
  2. public interface ContactDAO {  
  3. public List getContactList();  
  4. public Contact getContact(int contactId);  
  5. public void insertContact(Contact contact);  
  6. public void updateContact(Contact contact);  
  7. public void deleteContact(int contactId);  
  8. }  
  9.  

ContactDAO 是一个简单的 CRUD 接口:它定义了创建、更新、检索以及删除操作的方法。

现在,创建 ContactDAO.java 类的实现,程序如代码清单 5 所示。

代码清单 5. ContactDAOImpl.java

  1. package com.javaworld.sample.osgi.spring.contact.impl;  
  2. public class ContactDAOImpl implements ContactDAO {  
  3. public Contact getContact(int contactId) {  
  4. System.out.println("Inside ContactDAOImpl.getContact()");  
  5. return null;  
  6. }  
  7. // Do nothing implementation of all other methods defined in ContactDAO  
  8. }  
  9.  

ContactDAOImpl.java 为 ContactDAO 接口提供了一个“do nothing”(返回空)的实现。我们所要做的是利用这个类将方法名称写入到 System.Out。

请注意 Contact 和 ContactDAO 都必须是公共类(为了使用 ContactDAO 服务,其他套件需要访问它们),并且位于 com.javaworld.sample.osgi.spring.contact 包之中。但是,实际的实现类 ContactDAOImpl.java(对于 ContactDAO 套件是一个内部类)位于 com.javaworld.sample.osgi.spring.contact.impl 包中。

下面,我们来修改 ContactDAO 套件的 MANIFEST.MF 文件,以导出 com.javaworld.sample.osgi.spring.contact 套件,这样就可以从 HelloWorld 套件访问它了。我们只需在 MANIFEST.MF 中添加一行代码:Export-Package: com.javaworld.sample.osgi.spring.contact

Spring DM的 Spring 配置

下面,我们将创建 Spring 配置文件。Spring DM中推荐的方法是将配置划分为两个文件,一个用于定义 Spring bean,另一个用于将 Spring 输出为 OSGi 服务。下面,我们也会将作为示例的应用程序的配置划分为两个文件。第一步是在 META-INF/spring 文件夹中创建一个 contactdao-service.xml 文件,程序如代码清单 6 所示。

代码清单 6. Spring 语境(contex)文件

  1. < ?xml version="1.0" encoding="UTF-8"?> 
  2.  
  3. < beans xmlns="http://www.springframework.org/schema/beans" 
  4.  
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  6.  
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
  8.  
  9. < bean name="contactDAOService" 
  10.  
  11. class="com.javaworld.sample.osgi.spring.contact.impl.ContactDAOImpl"> 
  12.  
  13. < /bean> 
  14.  
  15. < /beans> 
  16.  

这个简单的 Spring 语境文件定义了 contactDAOService,指向 com.javaworld.sample.osgi.spring.contact.impl.ContactDAOImpl 类。

下一步,我们将创建 META-INF/spring/contactdao-osgi.xml 文件,用于将 contactDAOService 对象导出为 OSGi 对象:

代码清单 7. contactdao-osgi.xml

  1. < ?xml version="1.0" encoding="UTF-8"?> 
  2. < beans xmlns="http://www.springframework.org/schema/beans" 
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4. xmlns:osgi="http://www.springframework.org/schema/osgi" 
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
  6. http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd"> 
  7. < osgi:service id="contactDAOOSGiService" ref="contactDAOService" 
  8. interface="com.javaworld.sample.osgi.spring.contact.ContactDAO"> 
  9. < /osgi:service> 
  10. < /beans> 
  11.  

contactdao-osgi.xml 仅包含一个 < service> 元素,用于将 Spring bean 导出为公共寄存器里的 OSGi 服务。服务 < service>[元素]必须最少具有两个属性:一个是 id 属性,包含一个与导出 Spring bean 的名称相等的值,另一个是 interface 属性,它的值应与该接口名称相等(该接口名称下的服务将会被导出)。(< service>元素所支持属性的完整列表,请参阅 Spring DM参考指南)。

现在我们的 ContactDAO 已经准备好了。下一步是对 HelloWorld 进行扩展,这样它就可以使用新的服务了。

作为消费者的 HelloWorld

如果想要这个简单的 HelloWorld 应用程序能够担任消费者的角色,我们必须赋予它这样做的权限。第一步是更改该套件的 MANIFEST.MF 文件,添加一个 Import-Package 语句,如下所示:

  1. Import-Package: com.javaworld.sample.osgi.spring.contact 

现在,HelloWorld 套件将能够访问从 ContactDAO 套件的 com.javaworld.sample.osgi.spring.contact package 导出的类。

下面我们将修改 HelloWorld.java 类,如代码清单 8 所示。

代码清单 8. HelloWorld.java 的更改

  1. public class HelloWorld {  
  2. ContactDAO contactDAO;  
  3. public ContactDAO getContactDAO() {  
  4. return contactDAO;  
  5. }  
  6. public void setContactDAO(ContactDAO contactDAO) {  
  7. this.contactDAO = contactDAO;  
  8. }  
  9. public void start() throws Exception {  
  10. System.out.println("Hello Spring World!! " );  
  11. System.out.println(contactDAO.getContactList() );  
  12. }  
  13. public void stop() throws Exception {  
  14. System.out.println("Goodbye Spring World!!");  
  15. }  
  16. }  
  17.  

在代码清单8 中,我们首先将 ContactDAO 作为 Java bean 属性添加进来,包含所有相关的 getter 和 setter 方法。接着,我们修改类的 start() 方法,来调用 ContactDAO 服务的 getContactList() 方法,以及输出“Hello Spring World!!”消息。

Spring 配置文件

HelloWorld  套件的 Spring 配置文件分为两个文件:helloworld.xml 和 helloworld-osgi.xml。我们先从 helloworld-osgi.xml 开始,该文件如代码清单 9 所示。

代码清单 9. Spring 配置- helloworld-osgi-xml

  1. < ?xml version="1.0" encoding="UTF-8"?> 
  2. < beans xmlns="http://www.springframework.org/schema/beans" 
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4. xmlns:osgi="http://www.springframework.org/schema/osgi" 
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
  6. http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd"> 
  7. < osgi:reference id="contactDAOService" interface="com.javaworld.sample.osgi.spring.contact.ContactDAO"/> 
  8. < /beans> 
  9.  

这个 helloworld-osgi.xml 文件声明了一个引用元素,该元素用于索引 OSGi 服务并将其作为 Spring bean 在 HelloWorld 套件中可用。之前已经提到,引用元素包含两个属性:id 和interface。在将 OSGi 服务添加为应用程序中的 Spring bean 时,Spring DM将使用 id 属性的值。对于这种情况,我们已经指出,Spring DM应使该服务作为 contactDAOService 在 HelloWorld 套件的应用程序语境中可用。

第二个属性是 interface。Spring DM将使用该属性的值来查找与指定接口匹配的服务。在示例代码中,我们已说过,我们想要一个实现 com.javaworld.sample.osgi.spring.contact.ContactDAO 接口的服务。

Spring DM调用 BundleContext.getServiceReference() 查找实现了 com.javaworld.sample.osgi.spring.contact.ContactDAO 接口的服务。如果在 OSGi 框架中,与需要相匹配的服务多于一个,那么将返回具有最高等级的那个服务。此外,你还可以使用 filter 属性来精确地定义你想要的服务。

下一步,我们将修改 helloworld.xml 文件,使它能够将 contactDAOService 对象注入到我们的 hello bean 中,如代码清单 10 所示。

代码清单 10. Spring 配置 - helloworld.xml

  1. < ?xml version="1.0" encoding="UTF-8"?> 
  2. < beans xmlns="http://www.springframework.org/schema/beans" 
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
  5. < bean name="hello" class="com.javaworld.osgi.spring.HelloWorld" 
  6. init-method="start" destroy-method="stop" > 
  7. < property name="contactDAO" ref="contactDAOService"/> 
  8. < /bean> 
  9. < /beans> 
  10.  

一旦将 ContactDAOService 注入到套件的应用程序语境中,你就能够使用它作为任何你想要的其他 Spring bean。在示例代码中,我们将该服务作为一个 HelloWorld bean 的contactDAO 属性进行注入。

HelloWorld 导入服务

在 Eclipse IDE 中执行你的套件,当你启动 HelloWorld 套件时,在你的控制台里应显示“Hello Spring World!! Inside ContactDAOImpl.getContactList()”消息。在后台,一旦 Spring extender 套件被启动,它将看到存在两个 Spring 提供的套件。作为响应,它将首先为 ContactDAO 套件创建一个应用程序语境。同时,它查找 contactdao-osgi.xml 文件并将 ContactDAO  作为公共寄存器中的 OSGi 服务进行导出。接着,它将试图为 HelloWorld 套件创建一个应用程序语境。看到它具有一个引用元素,extender 调用 BundleContext.getService("com.javaworld.sample.osgi.spring.contact.ContactDAO") 方法,目的在于查找实现 com.javaworld.sample.osgi.spring.contact.ContactDAO 接口的类服务。

在示例代码(见代码清单 5)中,ContactDAOImpl 是唯一实现了该接口的服务,因此 extender 将返回 ContactDAOImpl 的一个对象。一旦该对象被返回,Spring DM就会将其作为 contactDAO 属性 注入到 HelloWorld bean 中。

【编辑推荐】

  1. 你好,OSGi!OSGi入门必读系列
  2. 使用Spring DM创建Hello World,以及OSGi服务
  3. OSGi与Spring:设置Spring DM开发环境
  4. OSGi和Spring入门:什么是Spring动态模型(Spring DM)?
  5. OSGi是什么:Java语言的动态模块系统
责任编辑:yangsai 来源: 51CTO.com
相关推荐

2012-06-07 09:15:14

ibmdw

2022-01-04 13:54:57

应用程序IT监测

2017-03-07 14:48:53

应用运维CMDB

2016-11-25 09:10:39

运维管理新思维

2009-06-01 11:37:46

EquinoxOSGi服务器

2009-11-06 12:49:11

WCF面向服务

2015-08-17 17:57:43

IT性能运维

2009-10-22 11:03:20

OSGi Web应用程

2009-01-03 14:25:10

ibmdwWeb

2010-06-13 09:22:37

jQuery

2021-11-10 05:30:21

Windows 11操作系统微软

2012-12-20 11:14:44

IBMdW

2024-01-03 11:44:26

开发云服务

2009-09-22 12:59:07

ibmdwWeb

2010-02-26 14:40:15

Python应用程序

2023-08-22 20:55:04

AzureLLMTypeChat

2012-08-15 10:02:50

搜索引擎

2010-05-22 11:21:51

绿色智能城市信息化建设华为

2010-04-28 16:32:11

互联网

2013-06-24 10:21:47

面向对象Web应用JavaScript
点赞
收藏

51CTO技术栈公众号