在Karaf的Application Container或Application Container Bundle中使用Embedded Felix,OSGi是一个完整的IoC容器吗?

时间:2015-09-16 15:29:08

标签: osgi apache-felix apache-karaf osgi-bundle spring-dm

想象一下,您希望在Java中拥有高度模块化的Web应用程序。组件也已经在使用Spring框架。有些组件只包含纯逻辑,有些组件也带有一些HTML格式的演示GUI。该应用程序不兼容Portlet,但我们需要具有动态菜单,该菜单可以提升已安装模块的列表以及指向页面或REST API的链接。既然它是Java,建议使用OSGI,但我对OSGI最近的功能(过去几年推出)太过困惑了,我几乎没有问题:

  • 现在OSGI不仅是模块管理系统,还有IoC Container!它几乎包含许多Spring IoC功能的等效注释。那么我们如何在OSGI中使用Spring启用的模块呢?我们可以为新设计消除Spring并完全依赖OSGI吗?或者对于模块中的依赖注入,我们可以使用Spring和依赖注入模块,我们可以使用OSGI吗?

  • 对于真实的大型应用程序,我们有两个选择:在应用程序容器(例如Tomcat)中使用嵌入式Felix或在KARAF中使用OSGI Bundle of Application Container(Jetty或Tomcat)。哪种方法更好?哪一个更具可扩展性?

2 个答案:

答案 0 :(得分:1)

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

如果将Spring用作IoC容器,可以考虑删除它。如果在您的OSGi容器中启用了DS,则OSGi DS会提供@Component@Reference注释(例如spring autowire)。新的OSGi enroute项目有一些modern examples执行IoC并提供REST服务。

更换更多功能可能需要做更多工作。由于OSGi中的类加载器差异以及Spring项目远离OSGi,因此在OSGi中运行最新的Spring可能不起作用。

答案 1 :(得分:0)

OSGi根本就不是IoC容器。虽然有一些在OSGi上运行的注入支持技术。最重要的是声明性服务和蓝图。 Spring并不是真的支持。有一些Spring DM支持,但这段代码不能维持多年。

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

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