想象一下,您希望在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)。哪种方法更好?哪一个更具可扩展性?
答案 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会更好。