首页 文章

OSGI服务与Singleton?

提问于
浏览
12

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

  • core -bundle中注册服务,插件可以访问该服务

  • 提供一个提供服务的单例类

使用OSGI服务似乎非常麻烦;并且由于插件必须依赖于Core(为了获得接口),使用OSGI服务的优势是什么?

4 回答

  • 1

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

    但是这里要考虑的是服务是否繁琐 . 哎呀,OSGi本身可以算是很麻烦 . 另一个包需要提供该类的实现吗?也许不吧 . Core捆绑包是否会关闭或无法按需提供实施?也许 .

    要确定某个服务是否适合所讨论的类,请阅读OSGi Alliance的What Is OSGi page上服务的特定优势 . 他们非常好地解释了你的单身人士课程如何变得比服务更麻烦 .

    祝好运 .

  • 8

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

    我认为单例模式以两种不同的方式使用:您只想在一组用户(例如日志服务)之间共享单个对象,或者您实际上只能有一个实例(例如,只有一个硬件) . 总的来说,我看到企业软件世界中的大多数人都在谈论前者 . 然而,经验表明,当项目增长时,单身人士变得更少单身,但更多的是共享对象,或者至少看起来是共享对象 . OSGi中的好处是你可以对两者进行建模,而“单身人士”的客户端也不知道它,也不需要一些中央配置 . 原因是OSGi依赖于负责的模块,注册服务是一种本地决策,就像收听服务一样 .

    服务的力量不在其动态中(虽然它们很酷,尤其是在开发期间),服务的本质是它们在模块内部提供完全本地控制而无需中央配置 . 一旦你理解了这是多么强大,就没有办法回来了:-)

    最后,OSGi服务并不繁琐,因为我们的DS带有注释 . 现在注册服务比创建Spring bean,没有xml,没有集中配置简单得多:


    // 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) { ... }
    }
    

    ......动态很大程度上是免费的......

  • 0

    我的OSGi Threading Model的poc让我相信,每项服务都是服务消费者的单身人士 . 作为唯一一个服务对象被注册到osgi服务注册表 . (但您也可以覆盖此行为) . 因此,就编程而言,单例类和OSGi服务的行为是相同的 . 您的类级别变量在各种服务使用者调用之间共享 .

    我会说OSGI服务是Singleton

    但也存在差异 . OSGi为每个服务提供了一个单独的类加载器,这在单例中是不可能的 . 所有类都由单个类加载器加载 . 我们不能在单例中有两个具有相同名称的类(完全限定名称),但这在OSGi中是可能的 .

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

    OSGi提供的另一个重要功能是更新捆绑包 . 考虑一下你改变了单例类中的代码 . 现在,您需要在正在运行的应用程序中部署此更新的类 . 您基本上需要重新启动系统,以便每个单例类加载器更新单例的新实例 . 这在OSGi中不是必需的,只需更新捆绑包即可 .

    我会说如果你要设计更大的应用程序(企业规模),或者如果你需要为有限的硬件容量(低内存限制,低计算能力)设计代码,那么去OSGi,它是最好的极端结束 . 对于所有其他人,您的普通Java编码将起作用完美 .

  • 15

    您可以管理服务的生命周期(部署新版本的服务,同时运行多个版本等)但是如果不重新启动JVM就无法管理单例的生命周期(即使重新启动,您也可以在任何时间点) .

相关问题