[JAVA] Lassen Sie uns das Betriebsbild (Atmosphäre) des DI-Containers von Spring erfassen

Wie verhält sich der DI-Container von Spring in diesem Eintrag (Objekte erstellen, abhängige Objekte auflösen)? Ich möchte den Bereich (grob) vorstellen. In diesem Eintrag gehen wir grundsätzlich davon aus, dass Sie "DI" kennen. Wer ist also überhaupt "DI"? Wenn ja, überprüfen Sie bitte "DI" im Internet oder in Büchern.

Der Inhalt der in diesem Eintrag vorgestellten Abbildungen ist die tatsächliche Verarbeitung, die von Spring ausgeführt wird (wobei festgestellt wird, dass das Wesentliche dessen, was Sie in diesem Eintrag einführen möchten, beeinträchtigt werden kann, wenn Genauigkeit angestrebt wird). Bitte beachten Sie, dass es einige Unterschiede gibt.

Schreiben Sie ein Programm ohne die Idee von DI

Bevor Sie ein Programm schreiben, das den DI-Container von Spring verwendet, sehen wir uns zunächst an, was passiert, wenn Sie ein Programm schreiben, das mehrere Klassen (Objekte) verwendet, ohne die Idee von DI-Container und DI zu verwenden.

Wahrscheinlich ... wird es so aussehen:

image.png

  1. Erstellen Sie ein A-Klassenobjekt in der Hauptmethode
  2. Rufen Sie die foo-Methode der Klasse A auf
  3. Erstellen Sie ein Objekt der Klasse B in der Methode foo der Klasse A.
  4. Rufen Sie die B-Klassenleistenmethode auf

Es ist ein sehr gewöhnliches Java-Programm.

Schreiben Sie ein Programm, das die Idee von DI enthält

Weiter ... Ich werde ein Programm schreiben, das die Idee von DI enthält. Lassen Sie uns insbesondere die Idee von DI in den Teil integrieren, in dem die Methode aufgerufen wird, nachdem das B-Klassenobjekt in der A-Klasse erstellt wurde (der Teil, in dem die Abhängigkeit von der B-Klasse auftritt).

image.png

  1. Erstellen Sie in der Hauptmethode ein Objekt der Klasse B (abhängig von Klasse A)
  2. Übergeben Sie in der Hauptmethode das B-Klassenobjekt an das Argument des Konstruktors, um das A-Klassenobjekt zu erstellen (= DI mit dem Konstruktor).
  3. Rufen Sie die foo-Methode der Klasse A auf
  4. Rufen Sie die B-Klassenleistenmethode auf

Durch die Integration der Idee von DI in die A-Klasse wurde der Prozess des Erstellens von B-Klassenobjekten in der A-Klasse eliminiert. Mit einer solchen Konfiguration kann eine Klasse zusätzlich zur B-Klasse eine Verarbeitung unter Verwendung von Objekten der untergeordneten Klasse der Klasse B ausführen (z. B. beim Durchführen eines Komponententests der Klasse A). Sie können eine untergeordnete Klasse der Test-B-Klasse anstelle der B-Klasse verwenden.

NOTE:

Dieser Eintrag basiert auf "DI using constructor", es gibt aber auch "DI using setter method" als DI-Typ. image.png

Ich denke, es ist besser, den Konstruktor und den Setter anhand der folgenden Kriterien richtig zu verwenden (Spring Reference. Framework-Referenz / core.html # Beans-Factory-Collaborators) steht zum Verkauf w).

  • Konstruktor für DI erforderlich
  • Wenn DI beliebig ist (es gibt ein Objekt, das standardmäßig verwendet werden soll, und DI wird als Option behandelt), die Setter-Methode

Wenn Sie die oben genannte Verwendung kennen, sieht das Verwendungsbild wie folgt aus. image.png

Verwenden Sie bei der Ausführung über die Bootstrap-Klasse das "im A-Objekt vorgenerierte B-Objekt" und bei der Ausführung über die Testklasse das "B-Objekt zum Testen". Ich habe versucht, es für die Verwendung zu konfigurieren.

Obwohl in diesem Eintrag nicht vorgestellt, verfügt Spring auch über einen Mechanismus zum "DI direkt zum Feld" (als aktueller Trend scheint "DI zum Feld" nicht verwendet zu werden. Die Menge an Code ist jedoch gering, da es sich um "DI to the field" handelt ... Ich verwende ihn manchmal ohne nachzudenken / w).

Schreiben Sie ein Programm mit dem DI-Container von Spring

Nachdem wir die von uns verwendete Klasse in eine DI-fähige Klasse geändert haben, wollen wir sehen, was passiert, wenn wir ein Programm mit dem DI-Container von Spring schreiben (darauf warten!?).

Erstellen einer Bean-Definitionsklasse

Vor dem Ändern des Programms ... Machen Sie den Teil, der die Objekte der im Programm verwendeten Klassen (A-Klasse und B-Klasse) erstellt, zu Bean-Definitionsklassen (Konfigurationsklassen).

image.png

Das Programm wurde geändert, um den DI-Container zu verwenden

Erstellen Sie nach dem Erstellen der Bean-Definitionsklasse einen DI-Container (Anwendungskontext) und ändern Sie das Programm, um die Bean (ein Klassenobjekt) der Klasse, die der Einstiegspunkt für die eigentliche Verarbeitung ist, aus dem DI-Container abzurufen.

image.png

Operationsbild bei Verwendung eines DI-Containers

Nachdem Sie nun den DI-Container von Spring verwenden können, sehen wir uns an, wie der DI-Container von Spring funktioniert.

image.png

  1. Erstellen Sie einen DI-Container (Anwendungskontext). Der Anwendungskontext liest den Inhalt der Bean-Definitionsklasse, die an das Argument des Konstruktors übergeben wurde, erstellt eine Bean (ein Objekt) und verwaltet sie im DI-Container.
  2. Eine Methode wird aufgerufen, um eine B-Klasse-Bean zu generieren, die keine Abhängigkeiten aufweist.
  3. Erstellen Sie ein Objekt der B-Klasse (zum DI-Container hinzugefügt).
  4. Die Methode zum Generieren der A-Klassen-Bean wird mit der vom DI-Container verwalteten B-Klassen-Bean als Argument aufgerufen.
  5. Übergeben Sie die B-Klassen-Bean als Argument des Konstruktors, um das A-Klassenobjekt zu erstellen (= DI mit dem Konstruktor).
  6. Nachdem der DI-Container erstellt wurde, holen Sie die Beans der Klasse (A-Klasse), die der Einstiegspunkt für die eigentliche Verarbeitung sein soll, aus dem DI-Container.
  7. Rufen Sie die foo-Methode "Eine aus DI-Container erhaltene Klassenbohne" auf.
  8. Rufen Sie die Balkenmethode der "B-Klassen-Bean", die DI war, als "A-Klassen-Bean vom DI-Container" auf.

Definieren Sie Beans mithilfe der Komponentenscanfunktion

Ich habe das Programm so geändert, dass es den DI-Container von Spring verwendet, aber es ist fast unmöglich, nur zwei Klassen in einer echten App zu verwenden ... Ich werde viel mehr Klassen verwenden. Zu diesem Zeitpunkt ... Es scheint schwierig zu sein, eine Methode zum Erstellen einer Bean in der Bean-Definitionsklasse zu definieren (in der Abbildung: MyConfig-Klasse)! ?? Wenn Sie die Bean-Definition schwierig finden, können Sie die Bean-Definition mithilfe der Komponenten-Scan-Funktion vereinfachen. Speziell···

Bitte.

image.png

Der Gesamtfluss ist der gleiche wie wenn die Komponentenscanfunktion nicht verwendet wird, aber der Prozess zum Generieren von Beans (Prozesse (2) bis (4) in der Abbildung) ist unterschiedlich. Bei Verwendung der Komponentenscanfunktion wird die Bean-Definition aus den gescannten Klassenmetadaten (Klassenanmerkung, Methodenanmerkung usw.) ermittelt und die Bean generiert.

Beispielprogramm

Obwohl sich die Inhalte geringfügig unterscheiden, wird das Beispiel der in diesem Eintrag eingeführten Inhalte im folgenden Repository gespeichert.

Zusammenfassung

Dieses Mal habe ich das Operationsbild eingeführt, wenn ich den DI-Container von Spring verwendet habe. Der in diesem Eintrag eingeführte Inhalt ist nur ein Teil (Touch-Teil) des gesamten Bilds des Spring DI-Containers. Um die Funktionen des DI-Containers effektiv zu nutzen, werden "Bean-Bereich" und "Bean-Priorität" verwendet. Sie müssen auch den Mechanismus der "Initialisierung / Verwerfungsverarbeitung", "AOP (Proxy)", "Profil" usw. kennen. Das Lesen dieses Eintrags ist jedoch der erste Schritt bei der Entwicklung einer Anwendung unter Verwendung des DI-Containers von Spring. Ich würde mich freuen, wenn Sie einen Schritt nach vorne machen könnten: grinsen :.

Eigentlich können Sie eine Anwendung durch "Nachahmung" entwickeln, ohne den Mechanismus des DI-Containers zu kennen. Sie können ein Ingenieur werden, der manchmal einfriert. Sofortige "Ergebnisse" sind wichtig (obwohl sie möglicherweise priorisiert werden müssen), aber es ist sehr wichtig zu verstehen, wie Ihr Programm als Anwendung funktioniert (= Funktionsprinzip). Ich denke es ist wichtig. Wenn es vorerst funktioniert, Sie aber nicht wissen, wie es funktioniert (= launisch), können Sie anhalten und die Grundlagen lernen, um diese Laune loszuwerden, und Sie können es bis jetzt nicht sehen (Hinweis) Ich denke, Sie können sehen, was ich nicht konnte.

Recommended Posts

Lassen Sie uns das Betriebsbild (Atmosphäre) des DI-Containers von Spring erfassen
Lassen Sie uns das Gefühl von Spring Boot + Swagger 2.0 überprüfen
Ändern Sie den Docker-Image- und Container-Platzierungsordner
Über DI des Frühlings ①
Über DI des Frühlings ②
Lassen Sie uns den Bildsuchfilter überprüfen
Ja, lassen Sie uns eine Vorschau des Bildes anzeigen. ~ part5 ~
Bildverarbeitung: Spielen wir mit dem Bild
Filtern Sie das Ergebnis von BindingResult [Spring]
Zeigen Sie Text über dem Bild an
Einführung in die Funktionen von JavaFX Scene Builder-Containern
Die Geschichte der Aktualisierung des Docker-Containers von Sonar Qube
Informationen zur Funktionsweise von next () und nextLine ()
Anmerkungen zur Spring Framework-Studie [Teil 1] DI-Container
Informationen zur ersten Anzeige von Spring Framework
[Java] [Spring] Testen Sie das Verhalten des Loggers
Überprüfen Sie die Funktion der Schnittstelle über den Thread
Einführung des Spring Boot Actuator, einer Funktion, die die Bedienung von Spring Boot-Anwendungen erleichtert