使用 Equinox 的Declarative Service 的一个简单例子

本文介绍如何使用Equinox OSGi Declarative Service简化OSGi服务注册过程,通过XML配置实现服务声明,类似于Spring框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  先前介绍过OSGI中的服务的注册,上次讲的服务的注册是通过手工来完成的,比如

LoginService loginService = new  LoginServiceImpl();
// 注册服务

context.registerService(LoginService.class.getName(), loginService, new  Hashtable());
// create a tracker and track the service

loginServiceTracker = new ServiceTracker(context, LoginService.class.getName(), null );
loginServiceTracker .open();
//使用

service =  (LoginService) loginServiceTracker .getService();
service .login();

  可以看到,非常的麻烦,现在我给大家介绍一个工具,名称为  Equinox OSGI Declarative Service,通过使用这个东西,我们可以像使用Spring那样来声明注册服务。

   Equinox 的org.eclipse.equinox.ds项目提供了OSGi R4规范中的Declarative Service标准服务的实现,该组件由Prosyst公司提供实现。Declarative Service提供了基于OSGI平台之上的面向服务构件模型(Service-Oriented Component Model),也为在OSGI基础之上搭建SOA应用提供了可能。Declarative Service实现并没有包含在Eclipse的默认软件包中,需要单独从 Eclipse 的的网站上获得,网站名称为  http://download.eclipse.org/eclipse/equinox/ 页面下载这个项目,这张网页也提供了其他的项目下载,有兴趣的话可以看看

   在提供了DS之后我们可以采用XML文件的方式来声明:

<?xml version="1.0" encoding="UTF-8"?>
<component name="LoginService">
    
<implementation class="org.vwpolo.osgi.service.model.impl.LoginServiceImpl"/>
    
<service>
        
<provide interface="org.vwpolo.osgi.service.model.LoginService"/>
    
</service>
</component>

上面的XML配置文件声明了LoginService的组件,组件实现类是 org.vwpolo.osgi.service.model.impl.LoginServiceImpl ,同时,声明了组件的服务接口为 org.vwpolo.osgi.service.model.LoginService 。我们将这个文件放在 OSGI-INF 文件夹中,文件结构如下图所示 :

接着我们再在 MANIFEST.MF 文件中指定服务配置文件的位置

Manifest-Version: 1.0
Bundle
-ManifestVersion: 2
Bundle
-Name: Services Plug- in
Bundle
-
SymbolicName: org.vwpolo.osgi.services
Bundle
-Version: 1.0.0

Service
-Component: OSGI-INF/ component.xml
Import
-Package: org.osgi.framework;version="1.3.0"

Eclipse
-LazyStart: true
Export
- Package: org.vwpolo.osgi.service.model,
 org.vwpolo.osgi.service.model.impl
Bundle
-Activator: org.vwpolo.osgi.service.Activator

上面的  " Service-Component: OSGI-INF/component.xml "  这行代码说明了 OSGI 服务配置文件的位置,下面先将项目的所有代码帖出来:

Org.vwpolo.osgi.services 项目的源代码:

Activator.java

package  org.vwpolo.osgi.service;
import
 org.osgi.framework.BundleActivator;
import
 org.osgi.framework.BundleContext;

public class Activator implements
 BundleActivator {
 
    
private
 BundleContext context;

    
public void start(BundleContext context) throws
 Exception {

    }
  
    
public void stop(BundleContext context) throws
 Exception {
    }
}    

LoginService .java

package  org.vwpolo.osgi.service.model;

public interface
 LoginService ...{

    
public void
 login(String name, String password);
}

LoginServiceImpl .java

package  org.vwpolo.osgi.service.model.impl;
import
 org.vwpolo.osgi.service.model.LoginService;

public class LoginServiceImpl implements
 LoginService {

    @Override
    
public void
 login(String name, String password) {
        
if (name.equals("vwpolo"&& password.equals("123"
))
            System.out.println(
"登录成功"
);
        
else

            System.out.println(
"登录失败,用户名或密码错误!" );
    }
}

UseOSGIServiceExample  项目的源代码:

Activator.java

 

package  org.vwpolo.osgi.service;

import
 org.osgi.framework.BundleActivator;
import
 org.osgi.framework.BundleContext;
import
 org.osgi.framework.ServiceReference;
import
 org.vwpolo.osgi.service.model.LoginService;

public class Activator implements
 BundleActivator {

    
private
 BundleContext context;

    
public void start(BundleContext context) throws
 Exception {
        
this.context =
 context;
        
        ServiceReference serviceRef 
= context.getServiceReference(LoginService.class
.getName());
        LoginService loginService 
=
 (LoginService) context.getService(serviceRef);
        loginService.login(
"vwpolo""123"
);
        System.out.println(
"OSGI框架已经成功启动了,一切运行正常"
);
    }

    
public void stop(BundleContext context) throws
 Exception {
    }
}    

项目建好了发现如果有错误的话那么肯定是环境没配置好,比如包没有导出或导入,

在 org.vwpolo.osgi.services 项目 MANIFEST.MF 文件中的 Runtime 标签页将org.vwpolo.osgi.service.model 和 org.vwpolo.osgi.service.model.impl 这两个包导出

然后在 UseOSGIServiceExample 项目的 MANIFEST.MF 文件中的 Dependencies 标签页将上面导出的两个包导入就行了

下面我们来运行一下看看最终的效果,打开运行配置对话框,

依次勾选上图中的要依赖的项目, 还是列出来比较好:

org.vwpolo.osgi.services

UserOSGIServiceExample

org.eclipse.equinox.app

org.eclipse.equinox.common

org.eclipse.equinox.ds

org.eclipse.equinox.registry

org.eclipse.osgi

org.eclipse.osgi.services

org.eclipse.osgi.util

点击运行,结果:

输入 ss 回车,可以看到插件的状态

osgi> ss

Framework is launched.

id   State       Bundle

0   ACTIVE      org.eclipse.osgi_3.3.0.v20070530

3   RESOLVED    UseOSGIServiceExample_1.0.0

4   ACTIVE      org.vwpolo.osgi.services_1.0.0

5   ACTIVE      org.eclipse.equinox.app_1.0.0.v20070606

6   ACTIVE      org.eclipse.equinox.ds_1.0.0.v20060601a

7   ACTIVE      org.eclipse.equinox.common_3.3.0.v20070426

8   ACTIVE      org.eclipse.equinox.registry_3.3.0.v20070522

9   ACTIVE      org.eclipse.osgi.services_3.1.200.v20070605

10   ACTIVE      org.eclipse.osgi.util_3.1.200.v20070605

osgi> 

我们看到 UseOSGIServiceExample 这个项目的状态没有激活,这是我们输入 start 3 (3代表OSGI框架分配的Bundle Id号),敲回车就可以看到结果了

osgi> start 3

登录成功

OSGI框架已经成功启动了,一切运行正常

osgi> 

从以上这个例子可以看出 Equinox的Declarative Service实现了一个服务构件定义、加载、装配、服务查找的一个服务构件运行环境,我觉得和Spring差不多。好了,就到这里吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值