我目前正在编写一个在OSGi环境中运行的应用程序。
对于可视化部分,我正在使用JavaFX。每个UI元素都是一个可扩展BorderPane的可停靠视图。其内容使用fxml文件中的fx:root元素进行描述。其中一些UI元素需要访问OSGi容器中的服务(例如,视图中的按钮可能会触发需要引用PersistenceService的保存操作)。
实现这一目标的最佳方法是什么?
UI元素由我使用的框架自动生成。访问服务的唯一方法是BundleActivator
或静态方法FrameworkUtil.getBundle()
。
我的方法是使用静态实用程序方法,但在网上阅读了一些后,我意识到你通常不想对OSGi本身进行编码。
另一种解决方案是使用Apache Felix提供的scr注释。将UI元素标记为@Component
并通过@Reference
引用所需的每项服务都可行。但这是好习惯吗?我应该注释它们吗?我总是认为@Component
引用的类是由OSGi本身管理的,并且总是由OSGi实例化。
答案 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。