写点什么

OSGi 4.3 引入了 Generics 与 Capabilities

  • 2011-03-31
  • 本文字数:2138 字

    阅读完需:约 7 分钟

在近日举办的 EclipseCon 2011 上,下一版的核心 OSGi 平台发布了最终草案,其文档将于不久之后发布。BJ Hargrave 在演讲中介绍了 OSGi 4.3 的新特性,并且概述了它与旧版之间的差别。

泛型

意料之中的一个特性就是核心 OSGi API 增加了泛型支持。这样就可以通过类型安全的操作查找特定类型的服务了,从而不必进行类型转换。然而,由于 OSGi 需要运行在嵌入式(1.5 之前)VM 上,因此没法使用 1.5 的编译器来构建核心 API。但很多人都会忽略 -target jsr14 这个选项,我们可以使用它编译使用了泛型的 Java 代码并运行在 1.4 兼容的 JRE 上。引入该选项的初衷是向 JSR 14 中的泛型进行迁移,但现在很多编译器都将其保留了下来。这样客户端代码(使用了 -target jsr14 选项在 1.4 下编译,或是在 1.5+ 上编译)就可以引用服务了,如下代码所示:

复制代码
// OSGi 4.2 way
// ServiceReference ref = context.getServiceReference(
// LogService.class.getName());
// LogService log = (LogService)context.getService(ref);
// OSGi 4.3 way
ServiceReference<LogService> ref = context.getServiceReference(
LogService.class);
LogService log = context.getService(ref);

然而,由于核心并非完全兼容于 1.5,因此并没有使用其他特性(诸如枚举和注解)。

Capabilities

在 OSGi 环境中,传统的依赖单元要么是 package 依赖,要么是 bundle 依赖(通过 Import-Package 或是 Require-Bundle)。虽然这些依赖对于代码没什么问题,但他们却没法很好地表达非代码的依赖。比如说,某个 bundle 可能需要一些内存或是 Web 服务器,但这两者都没法通过具体的 package 或是 bundle 来表示。

OSGi 4.3 引入了通用 capability 的概念,它可与 Require-Capability 和 Provide-Capability 搭配使用。在解析 bundle 之前必须得满足必要的 capability 需求。其典型使用场景是用于提供 OSGi 的声明式服务,该服务并不会表示为 package 依赖,但为了能够正确解析 bundle,我们还是需要它的。

此外,所需的最小版本号可以通过 capability 的形式展现出来:

复制代码
// Old way
// Bundle-RequiredExecutionEnvironment: JavaSE-1.6
// New way
Require-Capability: osgi.ee;filter:="(&(osgi.ee="JavaSE")(version>=1.6))"

出于通用性的考量,OSGi 4.3 已经不建议使用 Bundle-RequiredExecutionEnvironment 了(但仍然存在)。

Remote Services

OSGi Remote Services 并非新特性(OSGi 4.2 纲要的第 13 章已经对其进行了介绍),但他们已经被加到了 OSGi 4.3 Core 规范当中了。这样,所有的 OSGi 4.3 运行时都将会支持 Remote Services。

适配

某些服务(如 PackageAdmin)用于提供关于 bundle 的元信息,同时又不会使用特定类型的访问符污染 bundle 的接口。这样我们通常都会使用一些样板代码来确定 bundle 是如何连接的,或是其起始层次是什么。

简化很重要,OSGi 4.3 为 Bundle 引入了一个 adapt(类)方法。类似于 Eclipse 的 IAdaptable 平台,Bundle 可以转换为已知类型。本质上,如果 bundle 知道如何将自身转换为给定类型,那它就会返回一个实例;如果不知道(或是没有权限),那么就会返回 null。这简化了 PackageAdmin 和 StatLevelAdmin,如下代码所示:

复制代码
BundleWiring wiring = bundle.adapt(BundleWiring.class);
// wiring.getRequirements(null)
BundleStartLevel bsl = bundle.adapt(BundleStartLevel.class);
// bsl.getStartLevel()

现有的服务依然可用,但推荐普通用户使用新的 adapt 模式以简化实现。

Weaving

Weaving 支持也得以实现,这样扩展就可以插入到其他 bundle 的类加载机制中了。某些运行时系统使用了该技术,尤其是那些实现了 JPA 或是数据库持久化存储的系统——为了创建特定于该类型的代码。凭借 Weaving 回调,我们可以将标准的机制插入到 OSGi 框架中,而之前使用的则是特定于提供商的机制。

嵌套框架遭抛弃

虽然 Equinox 中已经有了一个试用的实现,但嵌套框架支持(意即框架可以加载嵌套的版本)却被 4.3 规范所抛弃了。

但却引入了更加强大的 BundleHook 和 ResolverHook API,这样扩展就可以创建虚拟的 bundle 集合,使之相互不可见。这种想法来源于之前的 ServiceHook,它可以实现服务之间的隐藏。

这样就可以通过创建彼此不可见的 bundle 分组来模拟嵌套框架了。它已经用于实现新的 Virgo region model ,后者则重新实现以支持这种新模型。

其副作用是如果彼此不可见,那么它可能会在同一个框架中安装相同 bundle/version 的多个版本。此前,当尝试再次安装相同的 bundle 时会出现错误。默认情况下这是不行的,但却可以在加载框架时在属性文件中通过 org.osgi.framework.bsnversion=multiple 属性实现这一点。默认情况下,该属性是 org.osgi.framework.bsnversion=single。

总结

新的 OSGi 规范会为框架引入大量有用的特性;对于那些不需要支持老框架的 bundle 来说,新的泛型 API 极具吸引力,可以促成他们的转换。嵌套框架与 weaving 不太可能产生直接的效果,但那些实现底层库的 bundle 则会通过标准的回调转换到这上面来,这会增加不同的 OSGi 框架之间的平台交互性。

该规范尚未正式发布,但预计会在今年 Eclipse 发布前发布,因为 Equinox 3.7 很可能会成为参考实现。

查看英文原文: OSGi 4.3 brings some Generics and Capabilities

2011-03-31 10:022028
用户头像

发布了 88 篇内容, 共 263.2 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

HarmonyOS的功能及场景应用

芯动大师

多表格文件单元格平均值计算实例解析

申公豹

Python

构建高效、安全的在线考试系统:基于Spring Boot和Vue的前后端分离之道

申公豹

深入理解嵌入式系统中的GPIO控制与应用

申公豹

嵌入式

WorkPlus十年铸剑,成就千万级用户信赖与认可

WorkPlus

项目分享:AIGC技术在智能教学生成中的应用

YoLo

AI

Seaborn 数据可视化全攻略:从基础到高级实战

申公豹

Python

Python图像处理:批量添加水印的优雅实现与进阶技巧

申公豹

Python

用纯 Python 打造的轻量级 Excel 到 Markdown 转换工具

申公豹

Python

基于STM32的物联网节点设计与实现-传感器数据采集与无线通信

申公豹

嵌入式

WorkPlus打造企业即时通讯平台,助力高效沟通与协作

WorkPlus

在Python中实现条形图动态追赶动画效果

申公豹

Python

嵌入式系统中的低功耗定时器应用与优化实战

申公豹

嵌入式

记一次本地环境启动不了Mysql的故障

DoHornBurg

Java MySQL hyper-v

深入学习Python与Vscode环境的安装与配置

申公豹

Python

手把手教你Python圣诞主题绘图

申公豹

Python

cmake | AI工程化部署

AIWeker

c AI AI工程化部署

基于Vue.js和Spring Boot的口罩自助售卖系统:设计、实现与技术深度解析

申公豹

开发

WorkPlus超级APP助力企业节省IT人力成本,实现快速移动化

WorkPlus

鸿蒙 API 9工程转换为API 10工程

坚果

HarmonyOS OpenHarmony

利用开源框架BMF实现高效视频处理

Geek-yan

Python从基础到进阶字符串验证

申公豹

Python

WorkPlus企业即时通讯系统的领先者,提升沟通效率的利器

WorkPlus

WorkPlus一站式协同解决方案,助力企业降本增效

WorkPlus

简洁灵活:Python中基于字段的不使用元类的ORM实现

申公豹

Python

掌握进阶:高级功能、图表定制与地理数据绘制

申公豹

Python

WorkPlus Meet实现企业局域网视频会议的领先解决方案

WorkPlus

个人技术成长方面的心得体会:边缘计算之旅

农夫三拳

深入探索嵌入式系统开发:从LED控制到物联网集成

申公豹

嵌入式

移动UI交互设计与动效制作

坚果

设计 UI 坚果派

Python文件操作指南:读写、异常处理与上下文管理器详解

申公豹

Python

OSGi 4.3引入了Generics与Capabilities_Java_Alex Blewitt_InfoQ精选文章