Je voulais faciliter la programmation JavaFX avec Spring Framework

Aperçu

En fait, c'est la Nième décoction, mais ce n'est peut-être pas la meilleure pratique car c'était un essai et une erreur au stade où il n'y avait pas cet article. ne pas.

point

Description dans la classe pour être ComponentScan

MainApp.java


/**
 *Classe de démarrage
 * @author ysrken
 */
@ComponentScan
public class MainApp extends Application {
    private static ConfigurableApplicationContext context;
    
    /**
     *fonction principale
     * @param args arguments de ligne de commande
     * @jette une exception d'exécution d'exception
     */
    public static void main(String[] args) throws Exception {
        //Puisque ce contexte sera réutilisé dans le futur, j'ai osé en faire une variable statique comme décrit ci-dessus.
    	context = new AnnotationConfigApplicationContext(MainApp.class);
        launch(args);
    }

    /**
     *Processus de démarrage JavaFX
     * @param stage Informations sur la phase
     * @jette une exception d'exécution d'exception
     */
    public void start(Stage stage) throws Exception {
        //Il est généré en toute sécurité, mais le fait est qu'il s'agit de getBean
        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();
    }
    
    /**
     *Utilisé pour acheminer le ApplicationContext
     * @return Shared ApplicationContext
     */
    public static ApplicationContext getApplicationContext() {
    	return context;
    }
    
    /**
     *Traitement de fin de JavaFX
     * @jette une exception d'exécution d'exception
     */
    @Override
    public void stop() throws Exception {
        context.close();
    }
}

La partie importante ici est " ConfigurableApplicationContext context", qui est utilisé par getApplicationContext () lors de la création d'autres fenêtres. En d'autres termes, lorsque vous utilisez FXMLLoader, définissez le contexte comme loader.setControllerFactory (MainApp.getApplicationContext () :: getBean); ʻau lieu de simplement faire new FXMLLoader (). En faisant cela, la DI du Spring Framework s'étend au "Controller" et au "Model" de la fenêtre.

Description dans le contrôleur

Controller.java


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

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

En définissant le contexte comme décrit ci-dessus, le modèle sera chargé uniquement par @ Autowired. Si vous prévoyez de créer plusieurs contrôleurs et modèles, supprimez les commentaires de la spécification SCOPE_PROTOTYPE.

Description dans le modèle

Model.java


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

Je suis content que @ Autowired fonctionne même dans Model.

Autre description

Je pense que la classe que vous voulez DI a @ Component etc., mais lorsque vous créez une instance d'une classe qui utilise @ Autowired à l'intérieur autre que la relation Controller ci-dessus, écrivez comme suit. Allons-y.

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();

Matériel de référence

Recommended Posts

Je voulais faciliter la programmation JavaFX avec Spring Framework
J'ai essayé de lier JavaFX et Spring Framework.
Je voulais classer la botte à ressort dans un multi-projet
L'histoire que je voulais développer Zip
Je voulais ajouter @VisibleForTesting à la méthode
Suivez du nœud racine au nœud inférieur avec JavaFX ~ Je connais l'itinéraire ~
J'ai utilisé Docker pour solidifier le modèle à développer avec Spring Boot.
Après tout, je voulais prévisualiser le contenu de mysql avec Docker ...
J'ai essayé de faire une authentification de base avec Java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai essayé de faire un jeu simple avec Javafx ① "Trouvons le jeu du bonheur" (inachevé)
Je voulais démarrer un serveur AP et déboguer avec juste la commande Maven
J'ai essayé ce que je voulais essayer avec Stream doucement.
J'ai essayé de faire un jeu simple avec Javafx ① "Trouvons le jeu du bonheur" (version inachevée ②)
J'ai essayé d'implémenter le téléchargement de fichiers avec Spring MVC
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
J'ai essayé de démarrer avec Spring Data JPA
Je souhaite utiliser le mode sombre avec l'application SWT
J'ai créé un domaine api avec Spring Framework. Partie 1
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 1 (édition API)
J'avais l'habitude de faire nc (netcat) avec JAVA normalement
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 2 (édition client)
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
Rendre Docker déroutant avec Pokemon et le rendre plus facile à attacher
Je veux faire une liste avec kotlin et java!
Je voulais juste créer une propriété réactive en Java
Je veux créer une fonction avec kotlin et java!
Voici quelques articles auxquels les débutants en programmation se sont référés.
Ce à quoi j'étais accro avec l'API REST Redmine
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
Je veux passer la commande de démarrage à postgres avec docker-compose.
J'ai résumé le cadre de la collection.
[Spring Boot] Je veux ajouter mon propre fichier de propriétés et obtenir la valeur avec env.getProperty ().
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
Je veux créer un bouton avec un saut de ligne avec link_to [Note]
Je veux comprendre le flux des paramètres de demande de traitement Spring
Je veux revenir à l'écran précédent avec kotlin et java!
J'ai essayé de me connecter à MySQL en utilisant le modèle JDBC avec Spring MVC
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
Ce que j'ai fait lors de la migration de la série Spring Boot 1.4 vers la série 2.0
J'ai essayé de créer une application Android avec MVC maintenant (Java)
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
Ce que j'ai fait lors de la migration de la série Spring Boot 1.5 vers la série 2.0
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Je veux contrôler le message d'erreur par défaut de Spring Boot
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
Je voulais écrire un processus équivalent à une instruction while avec l'API Java 8 Stream
J'ai essayé de comprendre le flux lors de l'analyse d'image avec Vision Framework et Core ML
Je suis allé au JJUG CCC 2019 Spring
Créer un outil de diaporama avec JavaFX
Programmation avec ruby (en route)
J'ai essayé d'interagir avec Java
J'ai essayé d'expliquer la méthode