OSGI 环境中的依赖注入
首先是一些背景:
我正在研究一些基于Apache Sling的webapp原型代码,它是基于OSGI并在Apache Felix上运行的。我对OSGI仍然比较陌生,尽管我认为我现在已经掌握了大多数概念。但是,令我困惑的是,我无法找到一个“完整”的依赖注入(DI)框架。我已经成功地使用声明性服务(DS)使用了基本的DI。但我的理解是,DS是用来引用的——我该怎么说呢?-- OSGI将服务和组件一起注册。为此,它工作正常,但我个人使用像Guice这样的DI框架将整个对象图连接在一起,并将对象放在正确的范围内(例如,想想或)。但是,我看过的OSGI特定框架似乎都不支持这个概念。@RequestScoped
@SessionScoped
我已经开始阅读有关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注释时,如何处理使用JSR 330注释的第三方库和框架?什么是好方法?在捆绑包中运行 JSR 330 容器?
我感谢你所有的回答,你一直很有帮助!