在 Karaf 的应用程序容器或应用程序容器包中使用嵌入式 Felix,OSGi 是一个完整的 IoC 容器吗?

Using Embedded Felix in Application Container or Application Container Bundle in Karaf and is OSGi a complete IoC container?

假设您想在 Java 中拥有一个高度模块化的 Web 应用程序。组件也已经在使用 Spring 框架。在 HTML 中,一些组件仅涵盖纯逻辑,而另一些组件还附带一些演示 GUI。该应用程序与 Portlet 不兼容,但我们需要动态菜单来提升已安装模块的列表以及指向页面或 REST API 的链接。由于它是 Java,因此建议使用 OSGI,但我对 OSGI 中的最新功能(过去几年推出)感到非常困惑,我几乎没有问题:

OSGi 根本不是 IoC 容器。不过,在 OSGi 上 运行 有一些注入支持技术。最重要的是声明式服务和蓝图。 Spring 不受真正支持。有一些 Spring DM 支持,但这段代码已经很久没有维护了。

所以你应该使用上面两个支持的 IoC 容器之一。对于白羊座蓝图,我使用 maven-blueprint-plugin 编写了对 CDI 注释的支持。这可能是您转换应用程序的最佳选择。我建议首先将您的 spring 应用程序转换为仅使用 CDI 注释,然后才开始 OSGi 迁移。这样的迁移并不容易。确保你得到一些好的指导和咨询。

如果您的大多数应用程序都不是 OSGi 并且您只想将 bundle 用于非常小的部分,那么在 servlet 容器上嵌入 Felix 是个不错的选择。如果您想为 OSGi 编写整个应用程序,Karaf 会更好。

研究 OSGi 可能会让人感到困惑,因为那里有 15 年的文章和示例 - 其中很多都是有效的,但可能已经过时了。

如果它只是用作 IoC 容器,您可以考虑删除 Spring。 OSGi DS provides @Component and @Reference annotations (like spring Autowire) if DS is enabled in your OSGi container. The new OSGi enroute project has some modern examples 执行 IoC 和提供 REST 服务。

替换更多功能可能需要更多工作。 运行 OSGi 中的最新 Spring 可能无法工作,因为 OSGi 中的类加载器存在差异,并且 spring 项目已从 OSGi 移出。