Доступ к Spring-контексту из наследника javafx.application.Application

В этом примере показано, как в получать доступ к контексту в общем случае.

package foo;

import org.springframework.context.ApplicationContextAware;

public class MyBeanImpl implements ApplicationContextAware {
   private ApplicationContext ctx;

   public void setApplicationContext(ApplicationContext context) {
     this.ctx=context;
   }
}

Не получилось воспроизвести это в моём приложении:

package dev.example;

import java.io.IOException;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;


@Component
public class GUI_Service extends javafx.application.Application implements ApplicationContextAware {

  private ApplicationContext applicationContext;

  // ...


  public static void startGUI() {
    launch();
  }

  @Override
  public void start(Stage primaryStage) {

    this.primaryStage = primaryStage;
    this.primaryStage.setTitle("JavaFX test");

    // ...
  }

  private void initializeRootLayout() {

    FXMLLoader FXML_Loader = new FXMLLoader();
    System.out.println("---");
    System.out.println(this.applicationContext); // null !!!
    // дальше бессмысленно
  }

  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext;
  }
}

В методе initializeRootLayout контекст всё ещё null.

Конфигурация:

package dev.example;

import org.springframework.context.annotation.*;


@Configuration
public class ApplicationContextConfig {

  @Bean
  public GUI_Service GUI_Service() { return new GUI_Service(); }
  // ...
}

? Репозиторий с приложением в нерабочем состоянии


Ответы (1 шт):

Автор решения: Kostya

Все-таки @Bean используют для специфичного создания, у вас же можно просто зарегистрировать их самому в ApplicationContext или указать их пакеты для сканирования.

По поводу ApplicationContextAware, почему бы вам просто не использовать @Autowired или @Inject для private ApplicationContext applicationContext;?

@Component
public class GUI_Service extends javafx.application.Application {
  @Inject
  private ApplicationContext applicationContext;
}
→ Ссылка