2017-04-13 27 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

相关问题