Eclipse扩展和声明式服务

iyfjxgzm  于 2023-01-25  发布在  Eclipse
关注(0)|答案(2)|浏览(131)

我对Eclipse体系结构中扩展/服务的方法有点困惑,开发人员有两种选择:

  1. Eclipse插件扩展的使用-http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html
    1.声明性服务的使用-http://www.eclipse.org/equinox/bundles/
    什么时候你会使用一种方法而不是另一种方法,每种方法的优缺点是什么?还有,未来哪种方法是首选?
ezykj2lf

ezykj2lf1#

在EclipseZone上有一个很好的比较(我想是从2007年开始):A Comparison of Eclipse Extensions and OSGi Services.
我会遵循目标平台的惯例,所以,如果您正在为Eclipse 3.4编写插件,那么创建一个Eclipse 3.4插件(它将使用 * MANIFEST. MF * 作为依赖项,使用 * plugin. xml * 作为扩展/扩展点-您链接到的文章是针对Eclipse 2.x的),您可以检查 * plugins * 目录的内容来确认这一点。

gg0vcinb

gg0vcinb2#

“当前”方法(3.5M5之前的版本,如eclipse3.4)的问题在于Eclipse插件扩展或OSGI DS(声明性服务)都需要在插件中存在一些特定于扩展或特定于OSGI的API。
我鼓励您查看此Powerpoint演示文稿中对声明式服务的介绍:
Component Oriented Development in OSGi with Declarative Services, Spring Dynamic Modules and Apache iPOJO,来自Eclipse 2009年版本。
这里有一个味道:
模块层允许最小化静态依赖关系,更少的静态依赖关系意味着组件工作所必须存在的“东西”更少。
服务允许您的组件与其他组件交互。

组件应作为POJO(Plain Old Java对象)与OSGi服务 * 粘合 * 在一起来实现。
声明性服务(DS)是OSGi概要第112节中的规范。

它是在4.0版中引入的,基于扩展程序模型。
像所有的扩展器一样,DS代表其他bundle执行任务。DS规范定义了这个扩展器,它是由框架实现的。
扩展器包本身称为服务组件运行时或SCR。
术语DS和SCR有时会混淆:
DS是规范,SCR是实现规范的实际捆绑包
OSGi R4.2中的DS有了显著的改进。
Equinox 3.5M5+支持其中许多更改。
SCR(“服务组件运行时”是一个“扩展包”,实现了新的和改进的OSGi R4.2 DS -声明性服务规范)将:

  • 创建组件。
    *将它们绑定到服务和配置
  • 管理组件的生命周期以响应绑定服务的进出。
  • 或者,将组件本身作为服务发布

你还有一张舱单

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>元素指定服务属性。这些属性在激活时传递给组件,并发布到服务注册中心

相关问题