【问题标题】:Using Embedded Felix in Application Container or Application Container Bundle in Karaf and is OSGi a complete IoC container?在 Karaf 的 Application Container 或 Application Container Bundle 中使用 Embedded Felix,OSGi 是一个完整的 IoC 容器吗?
【发布时间】:2015-12-13 06:59:54
【问题描述】:
想象一下,您希望在 Java 中拥有一个高度模块化的 Web 应用程序。组件也已经在使用 Spring 框架。一些组件仅涵盖纯逻辑,而另一些组件还带有一些 HTML 演示 GUI。该应用程序与 Portlet 不兼容,但我们需要动态菜单来提升已安装模块的列表以及指向页面或 REST API 的链接。由于它是 Java,因此建议使用 OSGI,但我对 OSGI 的最新功能(过去几年推出)感到非常困惑,我有几个问题:
现在 OSGI 不仅是模块管理系统,还是 IoC 容器!它几乎包含许多 Spring IoC 特性的等效注释。那么我们如何在 OSGI 中使用启用 Spring 的模块呢?我们能否在新设计中取消 Spring 并完全依赖 OSGI?或者对于模块内的依赖注入,我们可以使用 Spring,对于模块上的依赖注入,我们可以使用 OSGI?
对于现实生活中的大型应用程序,我们有两种选择:在应用程序容器(例如 Tomcat)中使用嵌入式 Felix 或在 KARAF 中使用 OSGI 应用程序容器包(Jetty 或 Tomcat)。哪种方法更好?哪一个更具可扩展性?
【问题讨论】:
标签:
osgi
apache-felix
apache-karaf
osgi-bundle
spring-dm
【解决方案1】:
OSGi 根本不是 IoC 容器。不过,有一些在 OSGi 上运行的注入支持技术。最重要的是声明式服务和蓝图。并不真正支持 Spring。有一些 Spring DM 支持,但是这段代码没有维护很久。
因此,您应该使用上述两个受支持的 IoC 容器之一。对于 aries 蓝图,我使用 maven-blueprint-plugin 编写了对 CDI 注释的支持。这可能是您转换应用程序的最佳选择。我建议首先将您的 spring 应用程序转换为仅使用 CDI 注释,然后才开始 OSGi 迁移。这样的迁移并不容易。确保你得到一些好的指导和咨询。
如果您的大多数应用程序都不是 OSGi 并且您只想在很小的部分中使用捆绑包,则在 servlet 容器上嵌入 Felix 是很好的选择。如果您想为 OSGi 编写整个应用程序,Karaf 会更好。
【解决方案2】:
研究 OSGi 可能会让人感到困惑,因为那里有 15 年的文章和示例——其中很多是有效的,但可能已经过时了。
如果 Spring 只是用作 IoC 容器,您可以考虑移除它。如果在 OSGi 容器中启用了 DS,OSGi DS 将提供 @Component 和 @Reference 注释(如 spring Autowire)。新的OSGi enroute 项目有一些modern examples 执行IoC 和提供REST 服务。
替换更多功能可能需要更多工作。在 OSGi 中运行最新的 Spring 可能由于 OSGi 中的类加载器差异以及 Spring 项目从 OSGi 中移出而无法工作。