You*_*iss 5 java spring javafx spring-boot
我愿意在我的 JavaFX 应用程序中使用 Spring boot 技术(以获得其依赖注入的优势),但我想知道对内存的影响,因为你知道任何带有“组件”符号的类都会被加载到 MetaSpace(因为 Spring boot 会从中创建一个静态对象),因此,将数十个 JavaFx 视图控制器加载到 MetaSpace 中,从应用程序启动到结束,它们永远不会被垃圾收集,这显然是一件坏事,有什么办法可以解决这个问题吗?
您在评论中写道:
\n\n\n当视图控制器没有被垃圾收集时,JavaFX 应用程序意味着视图对象将始终保留在那里 TableViews、ListViews、Panes ...这可能会占用一些重要的空间
\n
但我不认为\xe2\x80\x99 需要那样。
\n引用 Java 节点的控制器实例只是一个 Java 对象,与任何其他对象一样,当 JVM 中不再有对其的引用时,该实例将可用于垃圾回收。
\n让\xe2\x80\x99s 假设你像这样配置 JavaFX SpringBoot 集成:
\n\n因此,您将控制器工厂配置为使用 Spring beans:
\nfxmlLoader.setControllerFactory(\n springContext::getBean\n);\n
Run Code Online (Sandbox Code Playgroud)\n那么你的控制器就是你可以控制其范围的Spring bean。
\n如果您使用原型范围:
\n@Bean\n@Scope("prototype")\npublic PersonController personControllerPrototype() {\n return new PersonController();\n}\n
Run Code Online (Sandbox Code Playgroud)\n那么行为如下:
\n\n\n\nSpring 不管理原型 bean 的完整生命周期:容器实例化、配置或以其他方式组装原型对象,并将其交给客户端,而不会进一步记录该原型实例。
\n
通常,您将创建一个控制器并添加对其实例化到场景图中的对象树的引用。如果您在导航时替换场景图中的树,并且您不\xe2\x80\x99在任何地方保留对控制器的引用,则控制器和已从场景图中删除的任何其他关联节点都可以被垃圾收集。
\n或者,如果您只想加载一次 fxml 并永远保留控制器,您可以使用单例作用域来做到这一点。
\n因此基本上,您可以选择最适合您的应用程序或您正在使用的单个控制器的控制器的范围和生命周期。
\n 归档时间: |
|
查看次数: |
246 次 |
最近记录: |