Update
除了 afterburner.fx 之外,还可以结账胶子点燃 http://gluonhq.com/labs/ignite/:
Gluon Ignite 允许开发人员在其 JavaFX 应用程序中(包括在 FXML 控制器内)使用流行的依赖项注入框架。 Gluon Ignite 在几个流行的依赖注入框架(目前是 Guice、Spring 和 Dagger,但我们计划随着需求变得明显而添加更多)上创建了一个通用抽象。凭借 JSR-330 Gluon Ignite 的全面支持,在 JavaFX 应用程序中使用依赖项注入变得轻而易举。
将模型对象注入控制器也是通过@Inject,类似于afterburner.fx。
建议的方法
当您似乎正在寻找依赖注入框架时,我认为您最好的选择是使用afterburner.fx 框架 http://afterburner.adam-bien.com.
afterburner.fx 提供了一种使用标准 Java 将模型对象注入 JavaFX 控制器的方法@Inject http://docs.oracle.com/javaee/6/api/javax/inject/Inject.html注解。
替代依赖注入系统
Spring 庞大且复杂,除非您的应用程序需要它的许多其他功能,否则不应考虑它的复杂性。
Guice 比 Spring 简单得多,如果您需要一个具有众多功能(例如提供程序类)的依赖注入框架,Guice 是一个合理的选择。但从表面上看,您不需要 Guice 提供的所有功能,因为您只是想要一种在应用程序中传递对象的单例实例而不显式查找它们的方法。
因此,尝试一下 afterburner.fx 并看看它是否符合您的需求。
afterburner.fx 示例代码
这是注入模型实例的示例(NotesStore
)使用 afterburner.fx 进入控制器。示例是直接从afterburner.fx 文档 http://afterburner.adam-bien.com.
import com.airhacks.afterburner.views.FXMLView;
public class NoteListView extends FXMLView {
//usually nothing to do, FXML and CSS are automatically
//loaded and instantiated
}
public class AirpadPresenter implements Initializable {
@Inject // injected by afterburner, zero configuration required
NotesStore store;
@FXML // injected by FXML
AnchorPane noteList;
@Override
public void initialize(URL url, ResourceBundle rb) {
//view constructed from FXML
NoteListView noteListView = new NoteListView();
//fetching and integrating the view from FXML
Parent view = noteListView.getView();
this.noteList.getChildren().add(view);
}
}
跟随我.fx https://github.com/AdamBien/followme.fx是一个基本示例应用程序,演示如何使用 afterburner.fx。由于 Maven 依赖项不兼容,我在直接运行 followme.fx 时确实遇到了一些问题,所以我分叉它的代码 https://github.com/jewelsea/followme.fx并修复了一些阻止我开箱即用的问题。
回答评论中的补充问题
因此,从 NoteStore 示例来看,您是说我所要做的就是添加 afterburner 框架依赖项并将 @Inject 放在我的模型变量上?
不,您还需要创建一个扩展 FXMLView 的关联类,并通过新调用实例化该类(类似于上面示例代码中创建 NotesListView 的方式)。如果您有兴趣继续研究 afterburner.fx 框架,请使用 followme.fx 项目作为基础,因为它为使用该框架的非常简单的可执行示例提供了完整的源代码。
我尝试了 google guice 并让它工作。 。 。您将在构造函数中看到手动注入游戏设置对象。
我认为您不必像那样手动使用 Guice 注入器。我想你可以设置控制器工厂 http://docs.oracle.com/javafx/2/api/javafx/fxml/FXMLLoader.html#setControllerFactory%28javafx.util.Callback%29在 FXMLLoader 实例上启动注入。这就是如何FXMLView https://github.com/AdamBien/afterburner.fx/blob/master/src/main/java/com/airhacks/afterburner/views/FXMLView.java在 afterburner.fx 中可以做到这一点。 Guice 中使用的注入机制的具体细节将与 afterburner.fx 机制有所不同,但我认为设置控制器工厂的广泛概念仍然相似。
答案中有一个使用 FXML 和 Guice 的集合控制器工厂的演示:在 Guice 的模块配置中关联 FXML 和控制器 https://stackoverflow.com/questions/15990777/associating-fxml-and-controller-in-guices-module-configuration.
遗憾的是,没有一种更直接的方法可以做到这一点,并且不会给您带来这么多困难。
作为一个无关紧要的个人旁注,我对一般的依赖注入框架主题有点矛盾。当然,它们可以提供帮助,但很多时候,对于简单的事情,我通常可以使用带有 getInstance 方法的单例,而不是更复杂的框架。不过,我确实看到它们在较大的项目中如何有用,而且它们在某些 Java 框架中当然非常流行。