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

在应用程序容器或Karaf中的应用程序容器包中使用嵌入式Felix,OSGi是完整的IoC容器吗?,osgi,apache-felix,apache-karaf,osgi-bundle,spring-dm,Osgi,Apache Felix,Apache Karaf,Osgi Bundle,Spring Dm,想象一下,您希望在Java中拥有一个高度模块化的web应用程序。组件也已经在使用Spring框架。有些组件只包含纯逻辑,有些组件还附带了一些HTML表示GUI。该应用程序与Portlet不兼容,但我们需要有一个动态菜单,用于提升已安装模块的列表和指向页面或restapi的链接。由于它是Java,建议使用OSGI,但我对OSGI中最近的特性(在过去几年中引入)感到太困惑,我有几个问题: 现在OSGI不仅是模块管理系统,还是IoC容器!它几乎包含许多Spring IoC特性的等效注释。那么我们如何

想象一下,您希望在Java中拥有一个高度模块化的web应用程序。组件也已经在使用Spring框架。有些组件只包含纯逻辑,有些组件还附带了一些HTML表示GUI。该应用程序与Portlet不兼容,但我们需要有一个动态菜单,用于提升已安装模块的列表和指向页面或restapi的链接。由于它是Java,建议使用OSGI,但我对OSGI中最近的特性(在过去几年中引入)感到太困惑,我有几个问题:

  • 现在OSGI不仅是模块管理系统,还是IoC容器!它几乎包含许多Spring IoC特性的等效注释。那么我们如何在OSGI中使用支持Spring的模块呢?我们能在新设计中消除Spring,完全依赖OSGI吗?或者对于模块内的依赖项注入,我们可以使用Spring;对于模块上的依赖项注入,我们可以使用OSGI

  • 对于实际的大规模应用程序,我们有两种选择:在应用程序容器(例如Tomcat)中使用嵌入式Felix,或者在KARAF中使用应用程序容器的OSGI包(Jetty或Tomcat)。哪种方法更好?哪一个更具可伸缩性


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

      因此,您应该使用上面两个受支持的IoC容器之一。对于aries blueprint,我已经使用maven blueprint插件编写了对CDI注释的支持。这可能是您转换应用程序的最佳选择。我建议首先将spring应用程序转换为只使用CDI注释,然后才开始OSGi迁移。这样的迁移并不容易。确保你得到一些好的指导和咨询


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

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

      如果将它用作IOC容器,则可以考虑移除Spring。如果在OSGi容器中启用了DS,则提供和注释(如spring Autowire)。这个新项目有一些执行IoC和提供REST服务的功能

      更换更多的功能可能需要更多的工作。在OSGi中运行最新的Spring可能不起作用,因为OSGi中的类加载器不同,Spring项目将从OSGi中移出