在UI元素上使用OSGi DS是一种好习惯吗?

时间:2016-03-15 21:36:11

标签: java javafx osgi apache-felix osgi-bundle

我目前正在编写一个在OSGi环境中运行的应用程序。

对于可视化部分,我正在使用JavaFX。每个UI元素都是一个可扩展BorderPane的可停靠视图。其内容使用fxml文件中的fx:root元素进行描述。其中一些UI元素需要访问OSGi容器中的服务(例如,视图中的按钮可能会触发需要引用PersistenceService的保存操作)。

实现这一目标的最佳方法是什么?

UI元素由我使用的框架自动生成。访问服务的唯一方法是BundleActivator或静态方法FrameworkUtil.getBundle()

我的方法是使用静态实用程序方法,但在网上阅读了一些后,我意识到你通常不想对OSGi本身进行编码。

另一种解决方案是使用Apache Felix提供的scr注释。将UI元素标记为@Component并通过@Reference引用所需的每项服务都可行。但这是好习惯吗?我应该注释它们吗?我总是认为@Component引用的类是由OSGi本身管理的,并且总是由OSGi实例化。

1 个答案:

答案 0 :(得分:3)

首先,如果您想直接在Java代码中声明/引用您的服务,您应该考虑使用ServiceTracker来避免ServiceReference的许多问题。

SCR注释是一种很好的方法,另一种(对于已经使用Spring或Blueprint的遗留项目更友好)是直接使用Blueprint或者如果你想要弹簧功能spring osgi compendium和使用标准注释注入bean <service><reference> @ Named / @ Component,@ Inject / @ Autowired。

最后一个选项的主要好处是像Karaf这样的容器可以自动加载弹簧配置(考虑到它在META-INF / spring / * .xml文件中)和注册/参考服务。

例如,您可以使用whiteboard pattern轻松实施blueprint reference-list并跟踪为特定界面公开的所有服务。

对于注释,我认为辩论更多的是关于&#34;注释与配置文件&#34;与OSGi相关。我个人认为,在将您的实现与其他API绑定的侵入式注释之间进行选择,而其他解决方案(例如外部.xml配置文件,则不那么具有侵入性)。但最终,它比OSGi更受欢迎。请参阅this other thread