您在评论中写道:
当视图控制器没有被垃圾收集时,JavaFX 应用程序意味着视图对象将始终保留在那里 TableViews、ListViews、Panes ...这可能会占用一些重要的空间
但我认为不必如此。
引用 Java 节点的控制器实例只是一个 Java 对象,与任何其他对象一样,当 JVM 中不再有对其的引用时,该实例将可用于垃圾回收。
假设您像这样配置 JavaFX SpringBoot 集成:
- 在 JavaFX 中添加 Spring 依赖注入(JPA Repo、服务) https://stackoverflow.com/questions/57887944/adding-spring-dependency-injection-in-javafx-jpa-repo-service
因此,您将控制器工厂配置为使用 Spring beans:
fxmlLoader.setControllerFactory(
springContext::getBean
);
那么你的控制器就是你可以控制其范围的Spring bean。
如果你使用原型范围 https://www.baeldung.com/spring-bean-scopes#prototype:
@Bean
@Scope("prototype")
public PersonController personControllerPrototype() {
return new PersonController();
}
那么行为如下:
- 关于Spring bean容器中的范围和垃圾收集 https://stackoverflow.com/questions/8419073/regarding-the-scope-and-garbage-collection-in-spring-bean-container
Spring 不管理原型 bean 的完整生命周期:容器实例化、配置或以其他方式组装原型对象,并将其交给客户端,而不会进一步记录该原型实例。
通常,您将创建一个控制器并添加对其实例化到场景图中的对象树的引用。如果您在导航时替换场景图中的树,并且不在任何地方保留对控制器的引用,则控制器和已从场景图中删除的任何其他关联节点都可以被垃圾收集。
或者,如果您只想加载一次 fxml 并永远保留控制器,您可以使用单例作用域来做到这一点。
因此,基本上,您可以选择最适合您的应用程序或您正在使用的单个控制器的控制器的范围和生命周期。