我是OSGI的初学者,我想知道是否有人能够了解创建OSGI服务与单例模式之间的区别。例如,假设我有一个提供core
的包IService
,以及需要访问它的多个包。我可以:
core
- 套件中注册服务,插件可以访问使用OSGI服务似乎非常麻烦;并且由于插件必须依赖于Core(为了获得接口),使用OSGI服务的优势是什么?
答案 0 :(得分:16)
服务是独立模块之间的连接。模块依赖于服务(使用其规范包)可以显着减少模块之间的耦合,从而提供模块化的许多好处。
我认为单例模式以两种不同的方式使用:你只想在一组用户(例如日志服务)之间共享一个对象,或者你实际上只能有一个实例(例如,只有一个实例)硬件)。总的来说,我看到企业软件世界中的大多数人都在谈论前者。然而,经验表明,当项目增长时,单身人士变得更少单身,但更多的是共享对象,或者至少看起来是共享对象。 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) { ... }
}
......动态很大程度上是免费的......
答案 1 :(得分:8)
简短回答:如果您不 - 而且不会 - 需要OSGi服务的好处(例如,动态管理的服务实现和服务搜索),那么您不需要OSGi服务。< / p>
但这里要考虑的是服务是否繁琐。哎呀,OSGi本身可以算是很麻烦。另一个包需要提供该类的实现吗?也许不吧。 Core捆绑包是否会关闭或无法按需提供实施?也许。
要确定服务是否适合相关课程,请阅读OSGi Alliance What Is OSGi page上服务的特定优势。他们非常好地解释了你的单身人士课程如何变得比服务更麻烦。
祝你好运。答案 2 :(得分:1)
我OSGi Threading Model的poc使我相信,每项服务都是服务消费者的单身人士。作为唯一一个服务对象被注册到osgi服务注册表。 (但您也可以覆盖此行为)。因此,就编程而言,单例类和OSGi服务的行为是相同的。您的类级别变量在各种服务使用者调用之间共享。
我会说OSGI服务是Singleton ++
但也存在差异。 OSGi为每个服务提供了一个单独的类加载器,这在单例中是不可能的。所有{singleton}类都由单个类加载器加载。我们不能在单例中有两个具有相同名称(完全限定名称)的类,但这在OSGi中是可能的。
在某些情况下,我们必须确认一个类只应加载一次(使hibernate会话工厂,hdfc服务初始化,POJO创建只需要一次重度初始化)。现在,如果您生活在Java EE场景中,有时您的单例类会被两个不同的类加载器加载两次。所以这导致执行静态块两次;不必要的工作。 这样的类加载器问题很容易被OSGi处理(因为你是初学者,我觉得在接下来的几天里,类加载本身就是一个问题。)
OSGi提供的另一项重要功能是更新捆绑包。 考虑一下你改变了单例类中的代码。现在,您需要在正在运行的应用程序中部署此更新的类。您基本上需要重新启动系统,以便每个单例类加载器更新单例的新实例。这在OSGi中不是必需的,只需更新捆绑包即可。
我会说如果您要设计更大的应用程序(企业级),或者如果您需要为有限的硬件容量(低内存限制,低计算能力)设计代码,那么去OSGi,它是最好的为了极端。对于所有其他人,您的普通Java编码将完美地工作。
答案 3 :(得分:0)
您可以管理服务的生命周期(部署服务的新版本,同时运行多个版本等),但是如果不重新启动JVM就无法管理单例的生命周期(即使重新启动,您也只能拥有1个版本随时可用。)