[英]FXML Loader does not create new instance
我有一個JavaFX + Spring Boot應用程序。 當我嘗試使用其控制器加載新的FXML時,它工作正常,但是當我第二次或第三次加載時,它為我提供了相同的實例,並且不會創建新實例。
我的FXML加載器如下:
public <T> T loadAndGetController(String fxmlPath) throws IOException {
FXMLLoader loader = new FXMLLoader();
loader.setControllerFactory(context::getBean); // Spring now FXML Controller Factory
loader.setLocation(getClass().getResource(fxmlPath));
loader.setResources(ResourceBundle.getBundle("language/lang",
new Locale(languageController.getLanguage().getValue(), languageController.getLanguage().toString())));
loader.load();
return loader.getController();
}
加載新的FXML:
TabController tabController = (TabController) StageManager.loadAndGetController(FXMLViews.TAB.getFxmlFile());
當我嘗試將其添加到已加載的控制器列表中時,其ID與哈希代碼相同,這意味着它是相同的實例。 因此,它並沒有創建一個新的。
在這種情況下,也許我加載的FXML錯誤,或者只是Spring-Boot控制器工廠工作異常。 有什么建議么?
線
loader.setControllerFactory(context::getBean);
指示FXMLLoader
從spring應用程序上下文中獲取控制器:在內部, FXMLLoader
現在將執行以下操作
Class controllerClass = Class.forName(classNameFromFXMLFile);
Object controller = context.getBean(controllerClass);
getBean
取決於您為該類配置Bean的方式,但是默認情況下它將具有“單一”作用域。 這意味着它將創建該類的一個實例,並在每次調用getBean(...)
並使用映射到該bean的參數(例如bean的類getBean(...)
時返回相同的實例。
幾乎可以肯定,每次加載FXML文件時都需要一個控制器類的新實例,因此應將bean配置為具有“原型”作用域。 在“原型”范圍內,每次都會創建一個新實例。
定義Bean范圍的機制取決於您如何配置應用程序上下文,但是使用基於注釋的配置,您將執行以下操作
@Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class FarTabController { /* ... */ }
使用基於Java的配置
@Configuration
public class ApplicationConfig {
@Bean
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public FarTabController farTabController() {
return new FarTabController() ;
}
// ...
}
並且如果您仍在使用舊的基於模式的(XML)配置,則可以這樣做(如果我沒記錯的話)
<beans>
<bean class="my.package.FarTabController" scope="prototype" />
<!-- ... -->
</beans>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.