blog220120.Eclipse osgi之service
本文以eclipse 4.20为参考.
缘起
OSGi中的service由bundle注册和提供, framework管理, bundle使用.
service注册和使用的大致过程如下,
- bundle向framework注册service时提供service的相关信息,
- clazz(s)信息, clazz(s)是service obj所要实现的interface和class. 同时clazz也是client bundle查询该service的主要依据.
- argService, 可以是service obj本身, 也可以是ServiceFactory obj或ProtoypeServiceFactory obj. 后两者由framework使用, 生成service obj.
- properties, service携带的properties. clientBundle使用serviceReference可以读取.
- framework负责serviceRegistry, 接受bundle的注册申请, 生成一个serviceRegistration凭据.
- 当client bundle需要使用service时, 向framework申请service obj.
- framework根据clazz和filter信息查询该service, 并生成serviceReference返回给client bundle.
- client bundle使用serviceReference, 并根据service scope的不同, 进一步得到要使用的service obj.
service按照service scope分做3类,
- singleton, service只提供一个service obj, 所有client bundles公用该service obj.
- bundle, service为每一个client bundle提供1个service obj.
- prototype, service可以为每一个client bundle提供n个service obj.
针对prototype情形, 为了得到不同的service obj, 需使用serviceObjects.getService().
主要接口和类
Bundle
对应bundle. framework使用Bundle obj管理bundle的life cycle.
bundle有6态,
- uninstalled
- installed
- resolved, 已解决dependencies
- starting
- stopping
- active
BundleContext
与Bundle obj绑定的BundleContext是bundle与osgi framework交互的接口界面.
BundleContext obj在bundle start时建立, stop前失效, 确切说, 在bundleActivator.start(ctx)和bundleActivator.stop(ctx)之间是有效的.
与service相关的功能包括,
- addServiceListener and removeServiceListener
- getServiceReferences
- registerService,
- getServiceObjects
- getService and ungetService
ServiceRegistration<?> registerService(java.lang