如何在main函数中获取ApplicationContext - Spring启动

时间:2017-12-08 14:49:21

标签: spring spring-boot javafx

我想结合两个库 - 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没有正确注入,但为什么呢?我做错了什么?

1 个答案:

答案 0 :(得分:2)

您无法将ApplicationContext(或其他任何内容)注入调用Application的{​​{1}}实例中:start()的实例是由您创建的JavaFX,而不是Spring。由于它不是一个弹簧管理对象,因此没有机制让Spring向其中注入任何内容。

将调用移至ApplicationSpringApplication.run()方法,您可以直接在其中分配上下文。此外,让控制器进行Spring管理的更好方法是告诉init()通过Spring创建控制器,您可以使用控制器工厂。请参阅Dependency Injection and JavaFX

FXMLLoader