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

本文介绍如何使用SpringDM创建面向服务的联络管理应用程序。通过整合OSGi与Spring框架,文章详细展示了创建服务套件(ContactDAO)并将其导出为OSGi服务的过程,以及如何在HelloWorld应用中导入并使用这些服务。

【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

package com.javaworld.sample.osgi.spring.contact;
public class Contact {
int contactId;
String firstName;
String lastName;
public int getContactId() {
return contactId;
}
public void setContactId(int contactId) {
this.contactId = contactId;
}
}

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

代码清单 4. ContactDAO 接口

package com.javaworld.sample.osgi.spring.contact;
public interface ContactDAO {
public List getContactList();
public Contact getContact(int contactId);
public void insertContact(Contact contact);
public void updateContact(Contact contact);
public void deleteContact(int contactId);
}

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

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

代码清单 5. ContactDAOImpl.java

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

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)文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="contactDAOService"
class="com.javaworld.sample.osgi.spring.contact.impl.ContactDAOImpl">
</bean>
</beans>

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

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

代码清单 7. contactdao-osgi.xml

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

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 的更改

public class HelloWorld {
ContactDAO contactDAO;
public ContactDAO getContactDAO() {
return contactDAO;
}
public void setContactDAO(ContactDAO contactDAO) {
this.contactDAO = contactDAO;
}
public void start() throws Exception {
System.out.println("Hello Spring World!! " );
System.out.println(contactDAO.getContactList() );
}
public void stop() throws Exception {
System.out.println("Goodbye Spring World!!");
}
}

在代码清单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

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

这个 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

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

一旦将 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 中。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值