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();
}
我已经搜索了答案,但找不到太多。 我发现了什么: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();
}