Ich wollte die JavaFX-Programmierung mit dem Spring Framework vereinfachen

Überblick

Eigentlich ist es die N-te Abkochung, aber es ist möglicherweise nicht die beste Vorgehensweise, da es sich um einen Versuch und Irrtum handelte, als es keinen [diesen Artikel] gab (https://qiita.com/shibafu/items/b4c08597df010e95c99a). nicht.

Punkt

Beschreibung in der Klasse ComponentScan

MainApp.java


/**
 *Startklasse
 * @author ysrken
 */
@ComponentScan
public class MainApp extends Application {
    private static ConfigurableApplicationContext context;
    
    /**
     *Hauptfunktion
     * @param args Befehlszeilenargumente
     * @löst eine Ausnahme aus Laufzeitausnahme
     */
    public static void main(String[] args) throws Exception {
        //Da dieser Kontext in Zukunft wiederverwendet wird, habe ich es gewagt, ihn wie oben beschrieben zu einer statischen Variablen zu machen.
    	context = new AnnotationConfigApplicationContext(MainApp.class);
        launch(args);
    }

    /**
     *JavaFX-Startvorgang
     * @param stage Bühneninformationen
     * @löst eine Ausnahme aus Laufzeitausnahme
     */
    public void start(Stage stage) throws Exception {
        //Es wird sicher generiert, aber der Punkt ist, dass es getBean ist
        FXMLLoader loader = new FXMLLoader();
        loader.setControllerFactory(MainApp.getApplicationContext()::getBean);
        Parent rootNode = (Parent) loader.load(getClass().getResourceAsStream("/fxml/MainView.fxml"));
        Scene scene = new Scene(rootNode);
        stage.setScene(scene);

        mainStage.show();
    }
    
    /**
     *Wird zum Weiterleiten des ApplicationContext verwendet
     * @Geben Sie Shared ApplicationContext zurück
     */
    public static ApplicationContext getApplicationContext() {
    	return context;
    }
    
    /**
     *JavaFX-Terminierungsverarbeitung
     * @löst eine Ausnahme aus Laufzeitausnahme
     */
    @Override
    public void stop() throws Exception {
        context.close();
    }
}

Der wichtige Teil hier ist der Teil "ConfigurableApplicationContext context", der von "getApplicationContext ()" beim Erstellen anderer Fenster verwendet wird. Mit anderen Worten, wenn Sie "FXMLLoader" verwenden, legen Sie den Kontext als "loader.setControllerFactory (MainApp.getApplicationContext () :: getBean)" fest, anstatt ihn einfach als "neuen FXMLLoader ()" festzulegen. Auf diese Weise erstreckt sich der DI des Spring Frameworks auf den "Controller" und das "Modell" des Fensters.

Beschreibung im Controller

Controller.java


@Component
//@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class Controller{
    /**
     * Model
     */
    @Autowired
    Model model;

    /**
     *Initialisieren
     */
    public void initialize() {
        ~~~
    }
}

Wenn Sie den Kontext wie oben beschrieben einstellen, wird das Modell nur von "@ Autowired" geladen. Wenn Sie mehrere Controller und Modelle erstellen möchten, kommentieren Sie die Spezifikation "SCOPE_PROTOTYPE" aus.

Beschreibung im Modell

Model.java


@Component
//@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class Model{
    /**
     *Initialisieren
     */
    publicModel() {
        ~~~
    }
}

Ich bin froh, dass @ Autowired auch in Model funktioniert.

Andere Beschreibung

Ich denke, dass die Klasse, die Sie DI möchten, normalerweise "@ Component" usw. hat, aber wenn Sie eine Instanz einer Klasse erstellen, die "@ Autowired" in einer anderen als der obigen Controller-Beziehung verwendet, schreiben Sie wie folgt Lass uns gehen.

sample.java


@Component
public class SampleClass {
    /**
     * Model
     */
    @Autowired
    Hoge hoge;

    ~~~~~~
}

// OK
final SampleClass x = MainApp.getApplicationContext().getBean(SampleClass.class);
// NG
final SampleClass y = new SampleClass();

Referenzmaterial

Recommended Posts

Ich wollte die JavaFX-Programmierung mit dem Spring Framework vereinfachen
Ich habe versucht, JavaFX und Spring Framework zu verknüpfen.
Ich wollte Spring Boot in einem Multiprojekt gradle
Ich wollte der Methode @VisibleForTesting hinzufügen
Folgen Sie mit JavaFX vom Wurzelknoten zum unteren Knoten ~ Ich kenne die Route ~
Ich habe Docker verwendet, um die Vorlage zu verfestigen, die mit Spring Boot entwickelt werden soll.
Immerhin wollte ich den Inhalt von MySQL mit Docker in der Vorschau anzeigen ...
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich habe versucht, mit Javafx ein einfaches Spiel zu machen ① "Lass uns Glücksspiel finden" (unvollendet)
Ich wollte einen AP-Server starten und nur mit dem Befehl Maven debuggen
Ich habe versucht, was ich mit Stream leise versuchen wollte.
Ich habe versucht, ein einfaches Spiel mit Javafx zu machen ① "Lass uns Glücksspiel finden" (unvollendete Version ②)
Ich habe versucht, das Hochladen von Dateien mit Spring MVC zu implementieren
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich habe versucht, mit Spring Data JPA zu beginnen
Ich möchte den Dunkelmodus mit der SWT-App verwenden
Ich habe mit Spring Framework eine API-Domain erstellt. Teil 1
Ich habe eine Funktion zum Registrieren von Bildern bei der API in Spring Framework erstellt. Teil 1 (API Edition)
Ich habe nc (netcat) normalerweise mit JAVA gemacht
Ich habe eine Funktion zum Registrieren von Bildern bei der API in Spring Framework erstellt. Teil 2 (Client Edition)
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit spiritueller Technik zu erhöhen
Verwechseln Sie Docker mit Pokemon und erleichtern Sie das Anhängen
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich wollte nur eine reaktive Eigenschaft in Java erstellen
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Hier sind einige Artikel, auf die sich Anfänger in der Programmierung bezogen haben.
Was ich mit der Redmine REST API süchtig gemacht habe
Ich habe versucht, mit Swagger mit Spring Boot zu beginnen
Ich möchte den Startbefehl mit Docker-Compose an Postgres übergeben.
Ich habe den Sammlungsrahmen zusammengefasst.
[Spring Boot] Ich möchte meine eigene Eigenschaftendatei hinzufügen und den Wert mit env.getProperty () abrufen.
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich möchte mit link_to [Hinweis] eine Schaltfläche mit einem Zeilenumbruch erstellen.
Ich möchte den Ablauf der Spring-Verarbeitungsanforderungsparameter verstehen
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Ich habe versucht, mithilfe von JDBC Template mit Spring MVC eine Verbindung zu MySQL herzustellen
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Was ich bei der Migration von der Spring Boot 1.4-Serie zur 2.0-Serie getan habe
Ich habe versucht, eine Android-Anwendung mit MVC zu erstellen (Java)
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Was ich bei der Migration von der Spring Boot 1.5-Serie zur 2.0-Serie getan habe
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Ich möchte die Standardfehlermeldung von Spring Boot steuern
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
Eine Geschichte, die ich mit der Stream-API von Java8 einem Prozess schreiben wollte, der einer while-Anweisung entspricht
Ich habe versucht, den Ablauf bei der Bildanalyse mit Vision Framework und Core ML herauszufinden
Ich ging zum JJUG CCC 2019 Spring
Erstellen Sie mit JavaFX ein Diashow-Tool
Programmieren mit Ruby (unterwegs)
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, die Methode zu erklären