我想结合两个库 - JavaFx和Spring Boot,因此我需要在主类的start()方法中有一个ApplicationContext
的实例:
主要课程:
@SpringBootApplication
public class JavaFXandSpringBootTestApplication extends Application{
@Autowired
ApplicationContext ctx;
public static void main(String[] args) {
SpringApplication.run(JavaFXandSpringBootTestApplication.class, args);
launch();
}
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/LogIn.fxml"));
loader.setController(ctx.getBean(LogInController.class)); // HERE OCCURES ERROR
Scene scene = new Scene((Parent)loader.load());
stage.setScene(scene);
stage.show();
}
}
控制器类:
@Component
public class LogInController {
}
正如我所看到的那样,纪录片@SpringBootApplication
启用了组件的自动检测功能,并且引用了@Configuration
。
所以现在,为什么我在推荐的行中重现了NullPointerException?这是因为ctx没有正确注入,但为什么呢?我做错了什么?
答案 0 :(得分:2)
您无法将ApplicationContext
(或其他任何内容)注入调用Application
的{{1}}实例中:start()
的实例是由您创建的JavaFX,而不是Spring。由于它不是一个弹簧管理对象,因此没有机制让Spring向其中注入任何内容。
将调用移至Application
至SpringApplication.run()
方法,您可以直接在其中分配上下文。此外,让控制器进行Spring管理的更好方法是告诉init()
通过Spring创建控制器,您可以使用控制器工厂。请参阅Dependency Injection and JavaFX。
FXMLLoader