2017-04-13 28 views
0

我有一個JavaFX + Spring Boot應用程序。當我嘗試用它的控制器加載新的FXML時,它工作正常,但是當我第二次或第三次加載它時,它給了我相同的實例,並且不會創建一個新實例。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是相同的,作爲散列代碼,這意味着它是相同的實例。因此它沒有創建一個新的。

enter image description here

也許我裝我的錯FXMLs或只是Spring的引導控制器工廠在這種情況下工作的怪異。有什麼建議麼?

+0

'context'的範圍是什麼,'getBean'是如何實現的?如果只有一個'context'的實例,並且它總是返回相同的控制器,那麼將只有一個。 – Itai

+1

這不正是春天應該用它做的單身豆嗎? – fabian

回答

2

loader.setControllerFactory(context::getBean); 

指示FXMLLoader從Spring應用程序上下文得到控制:在內部,FXMLLoader現在會做這樣的事情

Class controllerClass = Class.forName(classNameFromFXMLFile); 
Object controller = context.getBean(controllerClass); 

getBean行爲取決於你如何配置該類的bean,但默認情況下它將具有「單例」範圍。這意味着它將創建該類的一個實例,並且每次調用getBean(...)時都會使用映射到該bean的參數(例如,bean的類)返回相同的實例。

每次加載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> 
+0

謝謝!我只是通過bean將我的控制器添加到我的ApplicationConfig類中,更改爲原型範圍,現在一切正常。 – Kefirchiks

相關問題