[JAVA] Saisissons l'image de fonctionnement (atmosphère) du conteneur DI de Spring

Dans cette entrée, comment se comporte le conteneur DI de Spring (créer des objets, résoudre des objets dépendants)? Je voudrais vous présenter la région (en gros). Dans cette entrée, nous supposons fondamentalement que vous connaissez "DI", alors qui est "DI" en premier lieu? Si tel est le cas, veuillez cocher «DI» sur le net ou dans les livres.

Le contenu des illustrations introduites dans cette entrée est le traitement réel effectué par Spring (ce qui détermine que l'essence de ce que vous souhaitez introduire dans cette entrée peut être altérée si la précision est recherchée). Veuillez noter qu'il existe des différences.

Ecrire un programme sans utiliser l'idée de DI

Avant d'écrire un programme qui utilise le conteneur DI de Spring, voyons d'abord ce qui se passe si vous écrivez un programme qui utilise plusieurs classes (objets) sans utiliser du tout l'idée de conteneur DI et DI.

Probablement ... cela ressemblera à ceci:

image.png

  1. Créez un objet de classe A dans la méthode main
  2. Appelez la méthode foo de la classe A
  3. Créez un objet de classe B dans la méthode de classe A foo
  4. Appelez la méthode de la barre de classe B

C'est un programme Java très ordinaire.

Ecrire un programme qui intègre l'idée de DI

Ensuite ... j'écrirai un programme qui incorpore l'idée de DI. Plus précisément, incorporons l'idée de DI dans la partie où la méthode est appelée après la création de l'objet de classe B dans la classe A (la partie où se produit la dépendance à la classe B).

image.png

  1. Créez un objet de classe B (en fonction de la classe A) dans la méthode principale
  2. Dans la méthode principale, passez l'objet de classe B à l'argument du constructeur pour créer l'objet de classe A (= DI en utilisant le constructeur)
  3. Appelez la méthode foo de la classe A
  4. Appelez la méthode de la barre de classe B

En incorporant l'idée de DI dans la classe A, il n'y a aucun processus pour créer un objet de classe B dans la classe A. Avec une telle configuration, une classe peut exécuter le traitement en utilisant des objets de la classe enfant de la classe B en plus de la classe B (par exemple, lors de l'exécution d'un test unitaire de la classe A). Vous pourrez utiliser une classe enfant de la classe test B au lieu de la classe B).

NOTE:

Cette entrée est basée sur "DI utilisant le constructeur", mais il existe également "DI utilisant la méthode setter" comme type de DI. image.png

Je pense qu'il vaut mieux utiliser correctement le constructeur et le setter en fonction des critères suivants (Spring Reference framework-reference / core.html # beans-factory-collaborateurs) est en vente w).

  • Constructeur pour DI requis
  • Si DI est arbitraire (il y a un objet à utiliser par défaut et DI est traité comme une option), la méthode setter

Si vous êtes conscient de l'utilisation ci-dessus, l'image d'utilisation ressemblera à celle ci-dessous. image.png

Lors de l'exécution via la classe Bootstrap, utilisez "l'objet B créé à l'avance dans l'objet A" tel quel, et lors de l'exécution via la classe de test, DI (remplacez) "l'objet B pour le test". J'ai essayé de le configurer pour l'utiliser.

Bien que non introduit dans cette entrée, Spring dispose également d'un mécanisme pour "DI directement sur le terrain" (comme une tendance récente, il semble que "DI vers le terrain" ne soit pas utilisé. Cependant, la quantité de code est petite car c'est "DI vers le terrain" ... Je l'utilise parfois sans réfléchir / w).

Ecrire un programme à l'aide du conteneur DI de Spring

Maintenant que nous avons modifié la classe que nous utilisons en une classe activée DI, voyons ce qui se passe lorsque nous écrivons un programme en utilisant le conteneur DI de Spring (en attendant!?).

Créer une classe de définition de bean

Avant de modifier le programme ... Transformez la partie qui crée les objets des classes (classe A et classe B) utilisées dans le programme en classes de définition Bean (classes de configuration).

image.png

Modification du programme pour utiliser le conteneur DI

Après avoir créé la classe de définition du bean, créez un conteneur DI (contexte d'application) et modifiez le programme pour obtenir le bean (objet de classe A) de la classe qui est le point d'entrée du traitement réel à partir du conteneur DI.

image.png

Image d'opération lors de l'utilisation d'un conteneur DI

Maintenant que vous êtes prêt à utiliser le conteneur DI de Spring, voyons comment le conteneur DI de Spring fonctionne.

image.png

  1. Créez un conteneur DI (contexte d'application). Le contexte d'application lit le contenu de la classe de définition Bean transmise à l'argument du constructeur, crée un bean (objet) et le gère dans le conteneur DI.
  2. Une méthode est appelée pour générer un bean de classe B sans dépendances.
  3. Créez un objet de classe B (ajouté au conteneur DI)
  4. La méthode de génération du bean de classe A est appelée avec le bean de classe B géré par le conteneur DI comme argument.
  5. Passez le bean de classe B à l'argument du constructeur pour créer l'objet de classe A (= DI en utilisant le constructeur)
  6. Une fois le conteneur DI créé, récupérez le Bean de la classe (classe A) qui sera le point d'entrée pour le traitement réel à partir du conteneur DI.
  7. Appelez la méthode foo de "Un bean de classe obtenu à partir d'un conteneur DI"
  8. Appelez la méthode bar du "bean classe B" qui était DI au "bean classe A par le conteneur DI".

Définir des beans à l'aide de la fonction d'analyse des composants

J'ai modifié le programme pour utiliser le conteneur DI de Spring, mais il est presque impossible d'utiliser seulement deux classes dans une vraie application ... J'utiliserai beaucoup plus de classes. A ce moment-là ... Il semble difficile de définir une méthode pour créer un bean dans la classe de définition du bean (dans la figure: classe MyConfig)! ?? Si vous trouvez la définition du bean difficile, vous pouvez simplifier la définition du bean en utilisant la fonction d'analyse des composants. En particulier···

S'il vous plaît.

image.png

Le flux global est le même que lorsque la fonction d'analyse des composants n'est pas utilisée, mais le processus de génération de beans (processus (2) à (4) sur la figure) est différent. Lors de l'utilisation de la fonction d'analyse des composants, la définition du bean est déterminée à partir des métadonnées de classe analysées (annotation de classe, annotation de méthode, etc.) et le bean est généré.

Exemple de programme

Bien que le contenu soit légèrement différent, l'échantillon du contenu introduit dans cette entrée est stocké dans le référentiel suivant.

Résumé

Cette fois, j'ai introduit l'image d'opération lors de l'utilisation du conteneur DI de Spring. Le contenu introduit dans cette entrée n'est qu'une partie (partie tactile) de l'image complète du conteneur Spring DI, et afin d'utiliser efficacement les fonctions fournies par le conteneur DI, "Bean scope" et "Bean priority" Vous aurez également besoin de connaître le mécanisme de «traitement d'initialisation / rejet», «AOP (Proxy)», «profil», etc., mais la lecture de cette entrée est la première étape du développement d'une application à l'aide du conteneur DI de Spring. J'apprécierais si vous pouviez faire un pas en avant: sourire:.

En fait, vous pouvez développer une application par "imitation" sans connaître le mécanisme du conteneur DI, mais: sweat_smile: ... Vous pouvez devenir un ingénieur qui gèle parfois. Les «résultats» immédiats sont importants (bien qu'il y ait des moments où vous devez les hiérarchiser), mais il est très important de comprendre comment votre programme fonctionne en tant qu'application (= principe de fonctionnement). Je pense que c'est important. Si cela fonctionne pour le moment, mais que vous ne savez pas comment cela fonctionne (= c'est de mauvaise humeur), vous pouvez vous arrêter et apprendre les bases pour vous débarrasser de cette mauvaise humeur, et vous ne pouvez pas le voir jusqu'à présent (remarquez). Je pense que vous pouvez voir ce que je n'ai pas pu faire.

Recommended Posts

Saisissons l'image de fonctionnement (atmosphère) du conteneur DI de Spring
Vérifions la sensation de Spring Boot + Swagger 2.0
Modifier le dossier de placement de l'image et du conteneur Docker
À propos de DI of Spring ①
À propos de DI of Spring ②
Vérifions le filtre de recherche d'images
Oui, prévisualisons l'image. ~ part5 ~
Traitement d'image: jouons avec l'image
Filtrer le résultat de BindingResult [Spring]
Afficher le texte en haut de l'image
Présentation des fonctionnalités des conteneurs JavaFX Scene Builder
L'histoire de la mise à jour du Docker Container de Sonar Qube
À propos du fonctionnement de next () et nextLine ()
Notes de l'étude Spring Framework [Partie 1] Conteneur DI
À propos de l'affichage initial de Spring Framework
[Java] [Spring] Tester le comportement de l'enregistreur
Vérifiez le fonctionnement de l'interface à travers le thread
Présentation de Spring Boot Actuator, une fonctionnalité qui facilite l'utilisation des applications Spring Boot