Spring 使用 FXML 进行构造函数注入

Spring constructor injection with FXML

我已经搜索了答案,但找不到太多。 我发现了什么:http://steveonjava.com/javafx-in-spring-day-2/ 这是一个很好的 post 关于如何使用 spring 控制器,但它说你不能使用构造函数注入。那不会有那么大的痛苦,只是对我来说不是那么干净。 当我想使用自定义控件(或自定义组件)时,问题就出现了。自定义控件由 javafx 创建,因此不会出现在 spring 上下文中。

问题是,对于给定的解决方案,spring 只会创建控制器。我找到了一种可行的方法。感谢 https://www.javacodegeeks.com/2012/04/fxml-custom-components-using.html 文章。但我想概括一下这个解决方案。所以计划是编写我的自定义 BuilderFactory 和 Builder 实现,这需要大量思考。

您如何看待这种做法?

欢迎每个想法

您当然可以使用 BuilderFactory 来做到这一点。代码一点也不差,因为默认的构建器工厂在 public API 中实现为 JavaFXBuilderFactory。因此,如果应用程序上下文中没有适当类型的 bean,您可以简单地委托给它。

基本上:

private Parent loadFXML(ApplicationContext applicationContext, URL fxmlLocation) 
        throws IOException {
    FXMLLoader loader = new FXMLLoader(fxmlLocation);

    // load controllers from application context:
    loader.setControllerFactory(applicationContext::getBean);

    // load controls from application context, where available:
    loader.setBuilderFactory(new BuilderFactory() {
        JavaFXBuilderFactory defaultFactory = new JavaFXBuilderFactory();

        @Override
        public javafx.util.Builder<?> getBuilder(Class<?> type) {
            String[] beanNames = applicationContext.getBeanNamesForType(type);
            if (beanNames.length == 1) {
                return new javafx.util.Builder<Object>() {

                    @Override
                    public Object build() {
                        return applicationContext.getBean(beanNames[0]);
                    }

                };
            } else {
                return defaultFactory.getBuilder(type) ;
            }
        }
    });

    return loader.load();
}