OSGI服务与Singleton?

OSGI服务与Singleton?,osgi,Osgi,我是OSGI的初学者,我想知道是否有人能告诉我创建OSGI服务和单例模式之间的区别。例如,假设我有一个bundlecore,它提供了IService,还有多个bundle需要访问它。我可以: 在核心-捆绑包中注册一个服务,插件可以访问该服务 提供提供服务的singleton类 使用OSGI服务似乎相当麻烦;既然插件必须依赖于核心(以获得接口),那么使用OSGI服务的优势是什么?您可以管理服务的生命周期(部署新版本的服务,并发运行多个版本等),但如果不重新启动JVM,您就无法管理单例的生命周期(即

我是OSGI的初学者,我想知道是否有人能告诉我创建OSGI服务和单例模式之间的区别。例如,假设我有一个bundle
core
,它提供了
IService
,还有多个bundle需要访问它。我可以:

  • 核心
    -捆绑包中注册一个服务,插件可以访问该服务
  • 提供提供服务的singleton类

  • 使用OSGI服务似乎相当麻烦;既然插件必须依赖于核心(以获得接口),那么使用OSGI服务的优势是什么?

    您可以管理服务的生命周期(部署新版本的服务,并发运行多个版本等),但如果不重新启动JVM,您就无法管理单例的生命周期(即使重新启动,您在任何时候都可以使用1个版本)。

    简短回答:如果您不需要OSGi服务的好处(例如,动态管理的服务实现和服务搜索),那么您就不需要OSGi服务

    但是这里要考虑的是服务是否繁琐。Heck,OSGi本身可以被认为是麻烦的。另一个包需要提供一个类的实现吗?也许不是。核心包会关闭还是不能提供一个按需实现?也许。

    要确定某项服务是否适合所讨论的类,请阅读OSGi联盟网站上某项服务的具体好处。他们很好地解释了您的单例类如何变得比服务更麻烦

    祝你好运。

    My的poc让我相信,对于服务使用者来说,每个服务都是一个单独的服务。因为只有一个服务对象被注册到osgi服务注册表中。(但你也可以覆盖此行为)。就编程而言,单例类和OSGi服务的行为是相同的。您的类级别变量在各种服务使用者调用之间共享

    我会说OSGI服务是单例的++

    但也存在差异。 OSGi为每个服务提供一个单独的类加载器,这在单例中是不可能的。所有{singleton}类都由一个类加载器加载。单例中不能有两个同名(完全限定名)的类,但在OSGi中是可能的

    在某些情况下,我们必须确认类应该只加载一次(使hibernate会话工厂、hdfc服务初始化、POJO创建只需要一次重初始化).现在,如果您生活在Java EE场景中,有时您的单例类会被两个不同的类加载器加载两次。因此,这会导致静态块执行两次;这是一个不必要的作业。 OSGi很容易处理此类类装入器问题(因为您是一名初学者,我觉得在接下来的几天内类装入本身就是一个问题)

    OSGi提供的另一个重要特性是更新包。 考虑到您更改了您的单级类中的代码。现在您需要在运行的应用程序中部署这个更新的类。您基本上需要重新启动系统,以便每个单级类加载器更新单例的新实例。这在OSGi不是必需的,只是更新包。< /P> 我会说,您是要为更大的应用程序(企业规模)设计,还是需要为有限的硬件容量(低内存限制、低计算能力)设计代码然后选择OSGi,它最适合极端情况。对于所有其他情况,您的普通java编码都能完美工作。

    服务是独立模块之间的连接。模块依赖于服务(及其规范包)可以显著减少模块之间的耦合,从而提供模块化的许多好处

    我认为单例模式有两种不同的使用方式:您只希望在一组用户之间共享一个对象(例如日志服务),或者您实际上只能有一个实例(例如,只有一块硬件).总的来说,我看到企业软件界的大多数人都在谈论前者。然而,经验表明,随着项目的发展,单例变得越来越少,而更多地是一个共享对象,或者至少看起来是一个共享对象。 OSGi的好处在于,您可以对两者进行建模,并且“单例”的客户机不会注意到它,也不需要一些集中配置。原因是OSGi依赖于负责的模块,注册服务是本地决定,就像侦听服务一样

    服务的力量并不在于它的动态(尽管它们很酷,尤其是在开发过程中),服务的本质是它们在模块内部提供完全的本地控制,而无需中央配置。一旦您了解了它的力量,就没有回头路了:-)

    最后,OSGi服务并不麻烦,因为我们有带注释的DS。注册服务现在比创建Springbean简单得多,没有xml,没有中心配置:




    。。。而且动态功能基本上是免费的…

    谢谢!我将阅读链接并重构代码,使之更加面向服务。正如我在回答中所指出的,我认为OSGi服务在与DS注释一起使用后不会有任何麻烦。看看bndtools。
    // A component registered as a ISingleton service
    @Component
    public class MyImpl implements ISingleton {
      void doSingle() { ... }
    }
    
    // A component that uses the ISingleton component
    @Component
    public class MyConsumer {
    
      @Reference
      void setISingleton(ISingleton is) { ... }
    }