我很高兴地报告(与Adrian一起),经过 3 个里程碑和 2 个候选版本后,Spring Dynamic Modules(以前称为 Spring OSGi)1.0 已发布。
自从我之前的文章(关于 1.0 M1)以来,许多功能得到了改进或添加;我将在以后的文章中详细讨论它们(还有参考文档详细解释了该库),所以我只列举几个
- 一致性
我们希望提供一个强大、简单且一致的编程模型。这就是为什么 Spring Dynamic Modules 建立在 Spring 之上并使用其久经考验的概念、可靠性和普遍性。
- 高度非侵入性
推荐使用 Spring DM 的方法是**不要**在代码中使用其类,也不要在 bundle 清单中包含任何导入。如果您不在代码中使用 Spring,而只用于应用程序配置,则同样适用。Spring DM 为您创建应用程序上下文,因此无需依赖 Spring 或 Spring DM。而且不用担心自定义命名空间或 XML 模式 - 我们已经涵盖了它们。
- OSGi 服务动态生命周期管理
这是 Spring DM 最重要的功能之一——能够像使用普通 bean 一样与 OSGi 服务进行交互。您可以发布和使用 OSGi 服务而无需编写任何代码;我们将处理动态——并且您可以完全控制(以后会详细介绍)。
- 更智能的集成测试框架
由于我们在内部广泛使用 Spring-DM 集成测试,因此我们改进了默认设置、Maven 集成,并使自动清单生成比以前更快、更智能。例如,该框架会自动确定测试包中可用的类,并且不会为其生成导入。
- 简化的 bundle 交互
Andy Piper(博客)添加了一种简单、声明式的方法,可以根据模块生命周期和 Spring bean 依赖关系来安装/启动/停止/更新 bundle。
- 受管的启动/关闭上下文创建
在 OSGi 中,应用程序被分解成各种模块(也称为 bundle),它们依赖于彼此的服务。这在模块之间创建了一个依赖关系树,这在启动和关闭期间变得很重要。传统上,这可以通过根据依赖关系顺序安装和启动 bundle 来解决,但这并不能完全解决问题。正如 OSGi 规范建议的那样,初始化需要很长时间的 OSGi 服务(例如连接池)应该依赖于与用于启动和停止 bundle 的不同的线程。这意味着如果一个 bundle 启动了,并不意味着它的服务也启动了。并非每个应用程序都准备好等待其在启动期间所需的特定服务——事实上,很少有应用程序这样做。这意味着一个 bundle 将会失败,因为它依赖于几毫秒后发布的服务(OSGi 默认情况下是一个在 VM 内的平台,事情发生得*非常*快)。
这种行为并不罕见——事实上,在具有多个 bundle 的多核平台上启动时,它非常常见。Spring DM 通过确定依赖关系(来自 Spring 配置)并在创建应用程序上下文之前等待它们可用,从而解决了这个问题。类似的过程将在关闭时使用,届时 Spring DM 将根据其依赖关系顺序停止上下文,因此您无需担心启动或停止 bundle。
- 无线程依赖等待
在讨论依赖机制时,我不能不提及 Hal Hildebrand 实现的用于依赖等待的“无线程”方法(听起来有点像矛盾,我知道——我们正在努力为它起一个更炫的名字)(参见他的博客)。由于各种服务需要可用才能使模块正确启动,因此需要某种等待/监控,这传统上意味着使用线程。
但是,在 OSGi 平台上可以(并且将会)有多个模块(很容易有几十个)——每个模块使用一个等待线程根本无法扩展。我们努力改进的其中一件事情是改进此模型,我相信我们提供了一个非常好的解决方案——等待过程中根本**不**使用线程。这意味着无论部署 3 个 bundle 还是 300 个 bundle,除非模块实际启动,否则不会占用 CPU 时间。
Spring Dynamic Modules 不仅仅是“Spring 化”API,而是处理不同的运行时环境。
关于工具,Spring IDE 支持 Spring DM 命名空间,并且(感谢Christian)还为 Eclipse PDE 提供了 Spring-DM 特定的目标,这是 Spring IDE 夜间构建中可用的功能(有关安装和使用插件的更多信息可在参考文档中找到)。
未来的方向
那么,现在 1.0 已经发布,接下来是什么?还有很多领域需要涵盖
Web 支持
OSGi 平台提供了一个专用的Http Service,但使用它需要编写代码。诸如资源加载、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 集成测试”