我是OSGI的初学者,想知道创建OSGI服务与单例模式之间的区别。比如,假设我有一个提供IService的核心(bundle名为core
),还有多个需要访问它的bundle。我可以:
- 在
core
bundle中注册一个服务,插件可以访问该服务 - 提供一个单例类,该类提供服务
使用OSGI服务似乎很麻烦;而且由于插件必须依赖于Core(以获取接口),那么使用OSGI服务的优势是什么呢?
我是OSGI的初学者,想知道创建OSGI服务与单例模式之间的区别。比如,假设我有一个提供IService的核心(bundle名为core
),还有多个需要访问它的bundle。我可以:
core
bundle中注册一个服务,插件可以访问该服务使用OSGI服务似乎很麻烦;而且由于插件必须依赖于Core(以获取接口),那么使用OSGI服务的优势是什么呢?
服务是独立模块之间的连接。让模块依赖服务(与其规范包一起)可以显著降低模块之间的耦合,从而为模块化带来很多好处。
我认为单例模式有两种不同的用法:你只想在一组用户之间共享一个对象(例如Log Service),或者确实只能有一个实例(例如只有一个硬件部件)。总的来说,我看到企业软件界大多数人都谈论前一种用法。然而,经验表明,当项目增长时,单例变得不那么单例了,而更像是共享对象,或者至少表面上是共享对象。 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) { ... }
}
...而且这些动态效果几乎是免费的...
但是,考虑的问题远不止于服务是否会很麻烦。 哎呀,OSGi本身就可以被认为是麻烦的。 另一个 bundle 是否需要提供该类的实现? 可能不需要。 核心 bundle 是否会停止运行或无法按需提供实现? 可能会。
要确定服务是否适用于所讨论的类,请阅读OSGi联盟的 What Is OSGi page 上有关服务特定优势的简介。 他们非常好地解释了如何使您的单例类变得比服务更加繁琐。
祝你好运。