我很高兴地报告(与 Adrian 一起)经过 3 个里程碑版本和 2 个发布候选版本,Spring Dynamic Modules(以前称为 Spring OSGi)1.0 版本已经发布。
自我的上一篇文章(关于 1.0 M1)以来,许多功能得到了改进或添加;我将在未来的文章中详细讨论它们(还有详细解释该库的参考文档),所以这里只列举几个:
- 一致性
我们希望提供一个强大、简单且一致的编程模型。这就是 Spring Dynamic Modules 构建于 Spring 之上并利用其成熟概念、可靠性和普遍性的原因。
- 高度非侵入性
推荐使用 Spring DM 的方法是不要在你的代码中使用其类,或在你的 Bundle Manifest 中导入它们。如果你在代码中不使用 Spring,仅用于你的应用程序配置,同样的规则也适用。Spring DM 为你创建应用程序上下文,因此你无需依赖 Spring 或 Spring DM。而且不必担心自定义命名空间或 XML Schema 等问题——我们已经涵盖了这些。
- OSGi 服务动态生命周期管理
这是 Spring DM 最重要的特性之一——能够像处理普通 Bean 一样与 OSGi 服务交互。无需编写任何代码即可发布和消费 OSGi 服务;我们将为你处理其动态性——你拥有完全的控制权(未来会详细介绍)。
- 更智能的集成测试框架
由于我们在内部广泛使用了 Spring-DM 集成测试,我们改进了默认设置、Maven 集成,并使自动 Manifest 生成比以前更快更智能。例如,框架会自动确定测试 Bundle 中可用的类,并且不会为其生成导入。
- 简单的 Bundle 交互
Andy Piper(博客)添加了一种简单、声明式的方法来根据模块生命周期和 Spring Bean 依赖关系安装/启动/停止/更新 Bundle。
- 受管理的启动/关闭上下文创建
在 OSGi 中,应用程序被分解成各种模块(也称为 Bundle),它们相互依赖服务。这在模块之间创建了一个依赖树,这在启动和关闭期间变得很重要。传统上可以通过按照依赖顺序安装和启动 Bundle 来解决这个问题,但这并不能完全解决问题。正如 OSGi 规范所建议的,初始化时间较长的 OSGi 服务(例如连接池)应该依赖于与用于启动和停止 Bundle 的线程不同的线程。这意味着如果一个 Bundle 启动了,并不意味着其服务就可用了。而且并非所有应用程序都准备好在启动时等待其所需的服务——事实上,很少有应用程序会这样做。这意味着一个 Bundle 会失败,因为它依赖于稍后几毫秒发布的服务(默认情况下,OSGi 是一个虚拟机内平台,事情发生得非常快)。
这种行为并不罕见——事实上,在具有多个 Bundle 的多核平台启动时非常常见。Spring DM 通过确定依赖关系(来自 Spring 配置)并在依赖可用后才创建应用程序上下文来解决这个问题。在关闭时也会使用类似的过程,Spring DM 将根据它们的依赖顺序停止上下文,这样你就不必担心启动或停止你的 Bundle 了。
- 无线程依赖等待
在讨论依赖机制时,不能不提到 Hal Hildebrand 实现的用于依赖等待的“无线程”方法(我知道这听起来有点矛盾——我们正在为它想一个好听的名字)(请参阅他的博客)。由于各种服务需要可用,模块才能正确启动,因此需要某种等待/监控机制,传统上这意味着使用一个线程。
然而,在一个 OSGi 平台上可以有(并且将会出现)多个模块(几十个轻而易举)——每个模块使用一个等待线程根本无法扩展。我们努力改进了这一点,我相信我们提供了一个非常好的解决方案——在等待过程中完全不使用线程。这意味着无论部署 3 个 Bundle 还是 300 个,都不会消耗 CPU 时间,除非你的模块实际开始启动。
Spring Dynamic Modules 不仅仅是将 API“Spring 化”,而是处理一个不同的运行时环境。
关于工具方面,Spring IDE 支持 Spring DM 命名空间,并且(感谢Christian)还为 Eclipse PDE 提供了 Spring-DM 特定目标,这是 Spring IDE 每夜构建版本中的一个功能(关于安装和使用该插件的更多信息可以在参考文档中找到)。
未来方向
既然 1.0 已经发布,接下来是什么?有很多领域需要涵盖
Web 支持
OSGi 平台提供了一个专用的Http 服务,但使用它需要编码。资源加载、JSP 生成和部署等事情可以大大简化。这是 1.1 版本的主要重点领域。
持久化
现代持久化工具提供了高级功能,例如延迟加载,这些功能通过依赖于类生成和代理,打破了 OSGi 环境强制执行的模块化边界。我们希望解决这个问题,就像 Web 支持一样,提供平滑的体验,无论是使用纯 JDBC 还是 ORM 工具。
AOP
继持久化问题之后,我们正在寻求在 OSGi 内部进行通用 AOP 的解决方案。这是一个难题,要正确实现它,需要内部 OSGi 平台的支持。好消息是,像 Equinox Aspects 这样的项目已经开辟了道路,并且 OSGi 企业专家组 (EEG) 也已将该问题纳入他们的关注范围。
说够了
如果你想了解更多关于 Spring Dynamic Modules 的信息,请访问项目页面和参考文档,并使用我们的邮件列表(论坛很快就会出现)。此外,最近我们制作了一些 OSGi/Spring DM截屏视频,这些视频可在 Spring DM 主页上找到。第一个视频(由两部分组成),由我本人制作,展示了如何快速创建一个项目来使用 Spring DM 进行集成测试。
为什么是集成测试?因为使用 Spring DM,这是一个非常简单快速的过程,也是了解 OSGi(尤其是模块化方面)的非常有效的方法。
未来会有更多截屏视频——只需告诉我们你想看什么,根据请求数量,我们将相应地安排它们。
事不宜迟,“使用 Spring DM 进行 OSGi 集成测试”
