我正在尝试一起使用JavaFX和Spring。我特别使用Spring Boot。
我的问题是我在FXML控制器中都有Spring自动连接字段和JavaFX“自动连接”字段。
我在构造函数控制器中放置了一个断点,它实际上被调用了两次:一个是Spring,只有@Autowired
个字段,一个是JavaFX,只是初始化@FXML
个字段。
这是我的主要代码:
@SpringBootApplication
public class MySpringAndJavaFXApp extends AbstractJavaFXAndSpringApplication {
@Override
public void start(Stage window) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("/fxml/home.fxml"));
window.setTitle("My Title");
window.setScene(new Scene(root, 500, 300));
window.show();
}
public static void main(String[] args) {
launchApp(MySpringAndJavaFXApp.class, args);
}
}
这是我要扩展的课程:
public abstract class JavaFXAndSpringApplication extends Application {
protected static void launchApp(Class<? extends JavaFXAndSpringApplication> classePrincipaleJavaFX, String[] args) {
launch(classePrincipaleJavaFX,args);
}
private ConfigurableApplicationContext applicationContext;
@Override
public void init() throws Exception {
applicationContext = SpringApplication.run(getClass());
applicationContext.getAutowireCapableBeanFactory().autowireBean(this);
}
@Override
public void stop() throws Exception {
super.stop();
applicationContext.close();
}
}
一个由Spring管理和JavaFX管理的类的示例:
@Component
public class MixedController {
@FXML
private TextField aTextField;
@Autowired
private MyService myService; // MyService is a @Component
public MixedController() {
System.out.println("I am here"); // debugger goes twice here
}
}
我如何轻松解决我的问题? 我尝试使用自定义FXML加载程序(例如JavaFX and Spring - beans doesn't Autowire)。但是,如果我用这样的加载器加载home.fxml文件,我在数据提供程序上出错(即Spring没有正确地获取我的数据库配置),我宁愿采用另一种方法。