级别: 中级 Naveen Balani, 企业架构师, IBM Rajeev Hathi, 技术架构师, Consultant
2009 年 8 月 03 日 使用 Felix 容器中的 Spring DM 框架构建 Java 类并将其打包为 OSGi 包。这篇文章是本系列的第 2 部分,向您介绍如何使用 Spring 框架创建包,然后将其部署到 Felix 运行时环境。您将了解如何通过基于简单的 Spring 配置删除核心 OSGi 框架依赖项。
引言
在本文中,您将回顾在本系列的第 1 部分中开发的旧应用程序。该应用程序现在将使用 Spring DM 构建和打包这些包。应用程序客户端将调用服务组件来处理订单,并且服务器组件将打印订单 ID。本文将使用基于 Felix 的 OSGi 容器帮助您了解 Spring DM 的概念及其用法。
系统要求
要运行本文中的示例,请确保已在计算机上安装和设置了以下软件:
- Java 5 或更高版本
- Ant 构建工具
- Felix 二进制分发版 1.0.4
- Spring DM 包
安装上述分发版以后,设置以下环境变量:(通过示例集 ANT_HOME=C:\apache-ant-1.7.0)。
- JAVA_HOME(用于 Java)
- ANT_HOME(用于 Ant)
接下来,将以下内容添加到 PATH 环境变量:
- JAVA_HOME\bin
- ANT_HOME\bin
Spring DM
Spring DM 包括帮助在 OSGi 环境中部署 Spring 应用程序的 JAR 或包。基于 Spring DM 的应用程序可以使用 OSGi 环境提供的服务。此类应用程序在开发基于 OSGi 的应用程序方面提供了便利。Spring DM 可以在 OSGi 环境中提供以下好处:
- 将应用程序模块化到动态包,并向这些包提供运行时服务。
- 向模块提供版本控制能力。
- 将模块打包为可以动态发现和使用的服务。
- 可以动态安装、更新和卸载模块。
- 在将应用程序配置为 OSGi 模块中利用 Spring 框架。
- 提供分开式业务逻辑和配置,从而使开发更加容易和方便。
回顾订单应用程序
我们将回顾本系列的第 1 部分中开发的订单应用程序。正如您所了解到的,类目前与 OSGi 框架紧密地耦合在一起。现在将通过使用 Spring DM 取消这种紧密耦合状态,将这些类作为简单的 POJO。下面,让我们看一下修改的 OrderClient.java。
清单 1. 客户端组件 OrderClient
package order.client;
import order.OrderService;
public class OrderClient {
private OrderService orderService;
public void setOrderService(OrderService orderService) {
this.orderService = orderService;
}
public void removeService() {
this.orderService = null;
}
public void start() {
orderService.processOrder();
}
public void stop() {
System.out.println("Bundle stopped");
}
}
|
OSGi 框架依赖项已完全删除。此类是一个普通的 POJO,仅使用 start() 方法处理订单。没有使用 ServiceTracker 类。
清单 2. OrderService 实现
package order.impl;
import order.OrderService;
public class OrderServiceImpl implements OrderService {
public void start() {
System.out.println("Order Service registered");
}
public void stop() {
System.out.println("Order Service stopped");
}
public void processOrder() {
System.out.println("Order id: ORD123") ;
}
}
|
类似地,上面的 OrderServiceImpl 也是一个使用 processOrder() 方法的简单 POJO。与 OSGi 核心组件没有关联。而且,客户端或服务类都不实现 BundleActivator。此处的包生命周期由 Spring DM 管理。
那么,这些简单的 POJO 如何作为 OSGi 组件使用?奥秘就在 Spring 配置文件中。您将在该文件中定义 OSGi 部分。
但在定义 XML 文件之前,需要对清单文件进行一些更改。该清单将包括导入包,而导入包又包含 Spring DM 文件。这可以确保 Spring 现在可以接管 OSGi 包的管理和生命周期。下面的代码段说明了服务和客户端清单文件。
清单 3. 服务清单
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Order Service
Bundle-SymbolicName: orderservice
Bundle-Version: 1.0.0
Import-Package: org.springframework.beans.factory.xml,
org.springframework.aop, org.springframework.aop.framework,
org.aopalliance.aop, org.xml.sax, org.osgi.framework,
org.springframework.osgi.service.importer.support,
org.springframework.beans.propertyeditors,
org.springframework.osgi.service.exporter.support,
org.springframework.osgi.service.exporter
Export-Package: order
|
清单 4. 客户端清单文件
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Order Service Client
Bundle-SymbolicName: orderclient
Bundle-Version: 1.0.0
Import-Package: org.springframework.beans.factory.xml,
org.springframework.aop, org.springframework.aop.framework,
org.aopalliance.aop, org.xml.sax, org.osgi.framework,
org.springframework.osgi.service.importer.support,
org.springframework.beans.propertyeditors,
org.springframework.osgi.service.importer,
org.springframework.osgi.service.exporter.support,
order
|
您将创建两个 XML 文件,分别用于服务组件和客户端组件。对于该服务,orderservice.xml XML 文件将定义订单服务实现 Bean,orderservice-osgi.xml XML 文件将定义订单服务接口并引用其实现。类似地,对于客户端,XML 文件将定义订单客户端 Bean,并引用订单服务组件。服务和客户端 XML 文件位于各自的 META-INF/spring 文件夹下。下面的代码显示了服务 XML 文件
清单 5. 服务 XML 文件 orderservice.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="orderService" class="order.impl.OrderServiceImpl"/>
</beans>
|
清单 6. 服务 OSGi XML 文件 orderservice.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="orderService" class="order.impl.OrderServiceImpl"/>
</beans>
|
实际上,您可以在一个 XML 文件中同时提供 Bean 和 OSGi 定义。没必要创建两个单独的文件。这里我们使用了两个单独的文件是为了能够区分接口定义和配置。这样管理和维护这些文件就变得非常容易。基于 Spring 的配置的诱人之处就是它可以让您在 OSGi 容器外测试订单服务 Bean。
为了能够实际做到这一点,您需要在 Felix 中安装相关的 Spring DM jar。
清单 7. Felix 配置部分
felix.auto.start.1= \
file:/felix-1.0.4/bundle/org.apache.felix.shell-1.0.1.jar \
file:/felix-1.0.4/bundle/org.apache.felix.shell.tui-1.0.1.jar \
file:/felix-1.0.4/bundle/org.apache.felix.bundlerepository-1.0.3.jar \
file:/osgi_spring/order/springlib/aopalliance.osgi-1.0-SNAPSHOT.jar \
file:/osgi_spring/order/springlib/jcl104-over-slf4j-1.4.3.jar \
file:/osgi_spring/order/springlib/log4j.osgi-1.2.15-SNAPSHOT.jar \
file:/osgi_spring/order/springlib/org.apache.felix.main-1.0.1.jar \
file:/osgi_spring/order/springlib/slf4j-api-1.4.3.jar \
file:/osgi_spring/order/springlib/slf4j-log4j12-1.4.3.jar \
file:/osgi_spring/order/springlib/spring-aop-2.5.1.jar \
file:/osgi_spring/order/springlib/spring-beans-2.5.1.jar \
file:/osgi_spring/order/springlib/spring-context-2.5.1.jar \
file:/osgi_spring/order/springlib/spring-core-2.5.1.jar \
file:/osgi_spring/order/springlib/spring-osgi-core-1.0.2.jar \
file:/osgi_spring/order/springlib/spring-osgi-extender-1.0.2.jar \
file:/osgi_spring/order/springlib/spring-osgi-io-1.0.2.jar
|
从上面的演示中可以看出,Felix 配置文件需要定义 Spring DM 包。您可以下载 Spring DM 包并将其放在您选择的文件夹中。在将 jar 放在适当的文件夹中之后,使用 Felix 配置文件中的相关项指定在 Felix 启动时安装这些 jar。
然后可以在 Felix 运行时环境中继续执行安装客户端和服务包的步骤。在安装之后,您应能够启动和停止这些包并会看到相同的结果。您会注意到,与基于 Felix 的 OSGi 不同,这次是 Spring DM 管理包的生命周期。
结束语
利用 Spring 框架的强大功能,可以更简单和更高效地开发 OSGi 应用程序。OSGi 本身还为 Java 应用程序的打包方式带来了革命性的改变。OSGi 与 Spring 的结合为开发企业范围的应用程序提供了坚实基础。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| OSGi Spring Order Application | osgispring_orderapp.zip | 11KB | HTTP |
|---|
参考资料 学习
获得产品和技术
- 下载 IBM 产品评估版,获得来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
讨论
作者简介  | 
|  | Naveen Balani 担任 IBM India Software Labs (ISL) 的架构师。他在 ISL 负责 WebSphere Business Services Fabric 的设计和开发活动。他喜欢研究新技术,并且是 IBM developerWorks 的固定投稿人,撰写过关于 Web 服务、ESB、JMS、SOA、体系结构、开源框架、语义 Web、J2ME、普及计算、Spring、Ajax 和各种 IBM 产品的大量文章。他还是 Beginning Spring Framework 2 和 Getting Started with IBM WebSphere Business Services Fabric V6.1 的合著者。 |
 | 
|  | Rajeev Hathi 一直担任 J2EE 平台软件顾问。他的主要兴趣包括基于 J2EE 的应用程序的体系结构确定和设计工作。他最热衷的主题是 Web 服务,他喜欢通过 Web 服务应用和传递 SOA 概念。他在业余时间喜欢观看体育赛事和欣赏摇滚音乐。 |
对本文的评价
|