`

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

 
阅读更多

【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 中。

分享到:
评论

相关推荐

    基于OSGi的面向服务的组件编程.pdf

    通过OSGi服务注册,用户管理模块可以发现并使用资源管理模块的服务,同时日志记录模块可以监听并记录所有模块的操作,而无需直接引用它们。这样的设计使得系统容易扩展,如果需要添加新功能,只需添加新的Bundle即可...

    【BluePrint】使用 Blueprint Container 规范构建 OSGi 应用程序

    总结来说,使用Blueprint Container构建OSGi应用程序能够带来诸多好处,包括模块化设计、动态服务管理和声明式配置。通过理解并熟练运用Blueprint,开发者可以更高效地开发和维护复杂的企业级应用程序。同时,结合...

    osgi 构建模块化云应用之中文版

    OSGi特别适合构建模块化云应用,因为它支持动态部署、更新和删除应用程序中的模块,而不需要重启服务器或中断正在运行的程序。 OSGi的核心概念包括模块(被称为Bundle),服务(Bundle之间的交互接口)和生命周期...

    基于 OSGi 的面向服务的组件编程

    基于 OSGi 的面向服务的组件编程呆呆呆呆呆呆地

    使用OSGi构建模块化云应用

    应对变更是构建应用程序要解决的基本问题之一。这并不一定很难,因为处理软件并不受什么物理法则的限制。变更是一个架构层面的问题,但不幸的是这一点经常被忽视。某种程度上这是符合逻辑的,因为多数时候你看不到...

    Equinox开发OSGi应用程序

    OSGi是动态模块系统的一个工业标准,支持模块化、面向服务和面向组件的应用程序开发。OSGi规范由OSGi联盟负责维护和更新,最新版本已经发展到了R4阶段。通过OSGi,开发者可以轻松地管理和控制应用程序中的各个模块...

    基于osgi构建小例子

    OSGi(Open Service Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序拆分成独立的、可管理的模块,这些模块可以动态地安装、卸载和更新,而不影响系统的其他部分。在Java世界中,OSGi提供了一种...

    使用Equinox开发OSGi应用程序

    总结来说,使用Equinox开发OSGi应用程序涉及到理解OSGi核心概念,创建和配置bundle,使用服务,以及构建模块化应用架构。通过Eclipse和Equinox,开发者可以获得强大的工具支持,简化开发流程,实现高度可扩展和动态...

    深入理解OSGi:Equinox原理、应用与最佳实践.pdf

    在企业应用中,OSGi可以用来构建服务网关或者中间件,以支持微服务架构。 由于OSGi提供了一个严格的模块化标准,它特别适合于大型分布式系统的设计和开发。在这些系统中,服务可能需要频繁更新而不影响系统的其他...

    基于OSGi和Spring开发Web应用.doc

    OSGi(Open Service Gateway Initiative)是一种面向服务的框架,能够提供动态模块部署和管理的能力。Spring 是一个轻量级的J2EE开发框架,特点是面向接口编程和非侵入式的依赖注入。将 OSGi 和 Spring 结合能充分...

    Enterprise OSGi in Action

    《企业OSGi实战》是一本面向开发者的实践指南,专注于使用OSGi技术构建下一代企业Java应用程序。本书通过提供相关的示例和案例研究,引导读者穿越新技术和项目构成的迷宫。OSGi(Open Services Gateway initiative)...

    OSGI教程_面向SOA的架构

    本教程主要针对面向服务架构(Service-Oriented Architecture, SOA)的开发者,旨在帮助他们更好地理解和应用OSGI技术。 **OSGI核心概念** 1. **模块系统**:OSGI的核心是它的模块系统,称为“Bundle”。每个...

    使用Equinox开发OSGI应用程序工程及源码

    **使用Equinox开发OSGI应用程序工程及源码详解** OSGi(Open Service Gateway ...总之,通过学习和实践这些知识点,开发者可以熟练掌握使用Equinox开发OSGi应用程序的技能,从而构建更加灵活、可维护的Java系统。

    OSGI应用程序

    总的来说,配置一个基于Eclipse Equinox OSGi的Web应用程序涉及对OSGI基本概念的理解、Eclipse Equinox的使用、Web服务的封装以及OSGI环境下的服务注册和发现。通过这种方式,你可以构建一个高度模块化、可扩展且...

    基于OSGi和Spring开发Web应用教程

    这样,Spring-DM会自动管理这些服务的生命周期,并使得其他bundle可以通过OSGi服务发现机制找到并使用它们。 总的来说,基于OSGi和Spring的Web应用开发结合了两者的优点:OSGi提供了模块化和动态部署的能力,而...

    两个osgi的例子程序

    OSGi是一种Java模块化系统,它允许开发者创建、部署和管理可互操作的模块化应用程序。这个系统的核心特性包括动态服务发现、版本控制和依赖管理,使得软件组件能够在运行时独立地安装、更新和卸载。 描述中提到的...

    基于OSGi和Spring开发Web应用

    Spring-DM,即Spring Dynamic Modules,是Spring官方在2008年推出的项目,旨在将Spring框架与OSGi模块化平台相结合,为Java开发者提供了一套全面的工具和API,以支持在OSGi环境中开发、部署和管理Spring应用程序。...

    在Eclipse RCP中应用Spring OSGI 管理bean(一)

    标题中的“在Eclipse RCP中应用Spring OSGI 管理bean(一)”表明这是一篇关于如何在Eclipse Rich Client Platform (RCP)应用程序中集成Spring框架,并利用OSGi服务来管理Bean的教程。Eclipse RCP是一个用于构建桌面...

    OSGI 开发文档中文的

    它提供了一种灵活的框架,使得开发者可以构建、部署和管理模块化组件,这些组件被称为服务或bundle。OSGI的核心理念是将应用程序分解为独立的、可交互的单元,这样可以方便地进行版本控制、依赖管理和动态更新。 在...

    Osgi in action.pdf

    13. **Web应用和服务**:讨论OSGi在Web应用和服务中的应用,包括如何利用OSGi构建动态的Web应用程序。 综上所述,OSGi不仅解决了Java平台缺乏模块化支持的问题,还引入了一系列新的概念和技术,极大地提高了Java...

Global site tag (gtag.js) - Google Analytics