簡體   English   中英

FXML Loader不會創建新實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM