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