首先是一些背景:
我正在开发一些基于Apache Sling的 webapp 原型代码,该代码基于 OSGI 并在 Apache Felix 上运行。尽管我认为我现在已经掌握了大多数概念,但我对 OSGI 还是比较陌生。然而,令我困惑的是,我一直无法找到一个“完整的”依赖注入 (DI) 框架。我已经使用声明式服务 (DS) 成功地使用了基本的 DI。但我的理解是 DS 是用来引用的——我该怎么说呢?-- OSGI 将服务和组件注册在一起。为此它工作得很好,但我个人使用像Guice这样的 DI 框架将整个对象图连接在一起并将对象放在正确的范围内(想想@RequestScoped
或@SessionScoped
例如)。然而,我看过的 OSGI 特定框架似乎都不支持这个概念。
我已经开始阅读有关OSGI 蓝图和iPOJO 的内容,但这些框架似乎更关心将 OSGI 服务连接在一起,而不是提供完整的 DI 解决方案。我不得不承认我还没有做过任何样品,所以我的印象可能不正确。
作为 Guice 的扩展,我已经尝试过Peaberry,但是我发现文档很难找到,虽然我得到了基本的 DI 工作,但很多 guice-servlet 的高级功能(自动注入过滤器、servlet 等)没有根本不工作。
所以,我的问题如下:
- 声明式服务与 Guice 或 Spring 等“传统”DI 相比如何?他们是解决同一个问题还是针对不同的问题?
- 到目前为止,我看到的所有 OSGI 特定解决方案都缺少 DI 范围的概念。例如,Guice + guice-servlet 具有请求范围的依赖关系,这使得编写 Web 应用程序非常干净和容易。我只是在文档中错过了这一点,还是这些框架中的任何一个都没有涵盖这些问题?
- JSR 330和基于 OSGI 的 DI 是两个不同的世界吗?例如,iPOJO 带来了自己的注释,而Felix SCR 注释似乎是一个完全不同的世界。
- 有人有构建基于 OSGI 的系统和 DI 的经验吗?甚至可能在 github 上有一些示例代码?
- 是否有人同时使用 Guice 和 iPOJO 等不同的技术,或者这只是一个疯狂的想法?
抱歉,这个问题很长。
非常感谢任何反馈。
更新
范围注入:范围注入是一种有用的机制,可以自动注入来自特定生命周期的对象。例如,您的某些代码依赖于作为 servlet 过滤器的一部分创建的 Hibernate 会话对象。通过标记依赖关系,容器将自动重建对象图。也许只是有不同的方法?
JSR 330 vs DS:从您所有出色的答案中,我看到这是两件不同的事情。这就提出了一个问题,当在 OSGI 上下文中使用时,如何处理使用 JSR 330 注释的第三方库和框架?什么是好方法?在 Bundle 中运行 JSR 330 容器?
感谢您的所有回答,您对我很有帮助!