OSGi 和 Spring,第 2 部分: 使用 Felix 构建 OSGi 并将其作为 S

来源:developerWorks 中国 作者:Naveen Balani
  
使用 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 管理包的生命周期。

结束语


时间:2009-08-05 09:14 来源:developerWorks 中国 作者:Naveen Balani 原文链接

好文,顶一下
(1)
100%
文章真差,踩一下
(0)
0%
------分隔线----------------------------


把开源带在你的身边-精美linux小纪念品
无觅相关文章插件,快速提升流量