“当前”方法(pre3.5M5,如 eclipse3.4)的问题在于 Eclipse 插件扩展或 OSGI DS(声明式服务)确实需要一些特定于扩展或 OSGI 的 API 存在你的插件。
我建议您在此 Powerpoint 演示文稿中查看对声明式服务的精彩介绍:
Component Oriented Development in OSGi with Declarative Services, Spring Dynamic Modules and Apache iPOJO,来自 EclipseCON2009。
这是一个味道:
模块层允许最小化静态依赖项,更少的静态依赖项意味着更少的stuff,您的组件才能正常工作。
服务允许您的组件与其他组件交互。
组件应以 POJO(普通旧 Java 对象)粘合与 OSGi 服务一起实现。
声明式服务 (DS) 是来自 OSGi 纲要第 112 节的规范。
它是在 4.0 版中引入的,基于扩展器模型。
与所有扩展程序一样,DS代表其他捆绑包执行任务。
DS 规范定义了这个扩展器,它由框架实现。
扩展包本身称为 Service Component Runtime 或 SCR。
术语 DS 和 SCR 有时会混淆:
DS 是规范,SCR 是实现规范的实际捆绑包
在 OSGi R4.2 中对 DS 进行了重大改进。
Equinox 3.5M5+ 支持其中许多更改。
SCR(“服务组件运行时”是一个“扩展包”,实现了新的和改进的 OSGi R4.2 DS - 声明式服务 - 规范)将:
- 创建组件。
-
将它们绑定到服务和配置
- 管理组件的生命周期以响应绑定服务的进出。
- (可选)将组件作为服务本身发布
你还有一个 MANIFEST.MF:
Bundle-SymbolicName : mybundle
Bundle-Version : 1.0.0
Service-Component : OSGI-INF/minimal. xml
您将使用:
org.eclipse.equinox.ds <version>.jar
org.eclipse.equinox.util <version>.jar
SCR 会自动找到激活/停用方法。
我们可以通过在 XML 声明中添加属性来调用它们。
在 R4.2 之前,方法名称无法更改,它们必须从 DS API 获取 ComponentContext 类型的参数。这破坏了组件的优势。
因此,您无需编写“BundleActivator”(组件中的 OSGI 特定 API:BAD),而是编写一个普通的 POJO 对象:
public class PollingComponent {
private static final int DEFAULT_PERIOD = 2000;
private PollingThread thread ;
protected void activate ( Map<String , Object> config ) {
System.out.println( " Polling Component Activated " );
Integer period = (Integer)config.get( " period " );
thread = new PollingThread(
period!=null ? period : DEFAULT_PERIOD);
thread.start();
}
protected void deactivate() {
System.out.println( " Polling Component Deactivated " );
thread.interrupt();
}
}
您将简单地声明您对其他服务的引用:
<reference name="LOG"
interface="org.osgi.service.log.LogService "
bind="setLog" unbind="unsetLog"
cardinality="0..1"/>
您可以将组件作为服务本身发布:
这是通过 XML 描述符中的 <service> 元素完成的。
<service>
<provide interface="net ... ContactRepository"/>
<property name="foo" value="bar"
</service>
只需添加额外的<provide> 元素即可提供多种服务。
使用<property> 元素指定服务属性。这些属性在激活时传递给组件并发布到服务注册表