Estoy dispuesto a usar la tecnología Spring Boot en mi aplicación JavaFX (para aprovechar su inyección de dependencia), pero me pregunto cuáles serán las consecuencias en la memoria, ya que saben que se cargará cualquier clase con una notación de "componente". al MetaSpace (ya que Spring Boot creará un objeto estático a partir de él), por lo que con decenas de controladores de vista JavaFx cargados en el MetaSpace, nunca se recolectará basura desde el inicio de la aplicación hasta el final, lo que obviamente es algo malo. , hay alguna forma de evitar este problema?
Escribes en comentarios:
Las aplicaciones JavaFX cuando el controlador de vista no obtiene basura recolectada significa que los objetos de vista siempre permanecerán allí TableViews,ListViews,Panes ... lo que puede ocupar un espacio importante
Pero no creo que tenga que ser así.
La instancia del controlador que hace referencia a los nodos de Java es solo un objeto de Java como cualquier otro y estará disponible para la recolección de basura cuando no haya más referencias a él en la JVM.
Supongamos que configura su integración JavaFX SpringBoot de esta manera:
Entonces configura su controlador de fábrica para usar Spring beans:
fxmlLoader.setControllerFactory( springContext::getBean );Entonces sus controladores son frijoles Spring cuyo alcance puede controlar.
Si usa el alcance del prototipo :
@Bean @Scope("prototype") public PersonController personControllerPrototype() { return new PersonController(); }Entonces el comportamiento es como se especifica en:
Spring no gestiona el ciclo de vida completo de un bean prototipo: el contenedor instancia, configura y ensambla un objeto prototipo y se lo entrega al cliente, sin más registros de esa instancia prototipo.
Por lo general, creará un controlador y agregará una referencia al árbol de objetos que instancia en el gráfico de escena. Si reemplaza el árbol en el gráfico de escena cuando navega, y no mantiene una referencia al controlador en ninguna parte, entonces el controlador y cualquier otro nodo asociado que haya sido eliminado del gráfico de escena pueden ser recolectados como elementos no utilizados.
O bien, si quisiera simplemente cargar el fxml una vez y mantener el controlador para siempre, podría usar el alcance singleton para hacerlo.
Básicamente, puede elegir el alcance y el ciclo de vida de sus controladores para que se adapte mejor a su aplicación o a los controladores individuales que está utilizando.