我正在使用带有JavaFX的Spring Boot 1.3.3。应用程序以此成功启动启动屏幕(此时applicationContext不为null)
@SpringBootApplication public class PirconApplication extends Application{ @Bean(name = "primaryStage") public Stage getPrimaryStage() { return new Stage(StageStyle.DECORATED); } private ConfigurableApplicationContext applicationContext = null; private static String[] args = null; @Override public void stop() throws Exception { super.stop(); Platform.exit(); applicationContext.close(); } @Override public void start(Stage primaryStage) throws Exception { Task<Object> worker = worker(); worker.setOnSucceeded(new EventHandler<WorkerStateEvent>() { @Override public void handle(WorkerStateEvent event) { try { AppSplashController loader = applicationContext.getBean(AppSplashController.class); Stage stage = applicationContext.getBean(Stage.class); stage.setScene(loader.init()); stage.initStyle(StageStyle.UNDECORATED); stage.show(); } catch (IOException e) { e.printStackTrace(); System.exit(0); } } }); worker.setOnFailed(new EventHandler<WorkerStateEvent>() { @Override public void handle(WorkerStateEvent event) { // TODO Auto-generated method stub System.exit(0); } }); worker.run(); } public static void main(String[] args) { PirconApplication.args = args; launch(PirconApplication.class, args); } private Task<Object> worker() { return new Task<Object>() { @Override protected Object call() throws Exception { applicationContext = SpringApplication.run(PirconApplication.class, args); return null; } }; } }
问题出在AppSplashController中,applicationContext和primaryStage bean全部为null。
@Component public class AppSplashController implements BootInitializable { @FXML private ImageView imgLoading; @FXML private Text lblWelcome; @FXML private Text lblRudy; @FXML private VBox vboxBottom; @FXML private Label lblClose; private Stage primaryStage; private ApplicationContext springContainer; /** * Initializes the controller class. */ @Override public void initialize(URL url, ResourceBundle rb) { System.out.println("applicationContext: "+springContainer); System.out.println("primaryStage: "+primaryStage); } } @Autowired @Override public void setPrimaryStage(Stage primaryStage) { this.primaryStage = primaryStage; } @Override public Scene init() throws IOException { Parent root = FXMLLoader.load(getClass().getResource("/com/pircon/views/splash.fxml")); return new Scene(root); } @Override public void setApplicationContext(ApplicationContext ac) throws BeansException { this.springContainer = ac; } }
BootInitializable接口
public interface BootInitializable extends Initializable, ApplicationContextAware { public Scene init() throws IOException; public void setPrimaryStage(Stage primaryStage); }
这是我Spring和Spring靴子的第一个项目,请原谅我的无知。
我认为您需要指定spring来设置这些bean的自动装配。例如
@Autowired private ApplicationContext springContainer;
另一个建议是使用ApplicationContextProvider,它实现了Spring ApplicationContextAware接口。
public class ApplicationContextProvider implements ApplicationContextAware { private static ApplicationContext context; public static ApplicationContext getApplicationContext() { return context; } @Override public void setApplicationContext(ApplicationContext ctx) { context = ctx; } }
您可以通过获取应用程序上下文 ApplicationContextProvider.getApplicationContext();
ApplicationContextProvider.getApplicationContext();