Zunächst application.yml Konfigurationsprofil wie folgt:
Maven-Projekt pom.xml Pakete hinzufügen:
Erstellen Sie ein neues abgebildetes Objekt mit folgendem Code:
Der String-Typ muss einen Setter benötigen, um Eigenschaftswerte zu erhalten; Karten, Sammlungen und Arrays sind nicht erforderlich
Verwenden Sie @Autowired Annotationen, um automatisch einzufügen, wie im folgenden Bild gezeigt:
esConfig gibt immer null aus, ich habe lange nach einer Lösung gesucht, aber fehlgeschlagen, es wird unten eine Lösung geben.
Lassen Sie uns einen neuen Controller erstellen, der Code ist wie folgt:
Die Injektion ist erfolgreich, und die Werte der yml-Konfigurationsdatei werden wie folgt erhalten:
Die Gründe, warum EsClient nicht erfolgreich injiziert werden kann, sind wie folgt:
Man nenne eine Funktion dieser Klasse im Konstruktor, und die Variable der @Autowired dieser Klasse wird in dieser Funktion verwendet.
Deshalb dachte ich, es könnte schiefgehen. Weil @Autowired warten muss, bis die Klasse konstruiert ist, bevor sie aus externen Referenzen gesetzt werden kann. Daher muss die Einspritzzeit von @Autowired später sein als die Ausführungszeit des Konstruktors. Lösung:
Spring Team empfiehlt: "Verwenden Sie immer konstruktorbasierte Abhängigkeitsinjektion in Ihren Bohnen. Verwenden Sie immer Behauptungen für obligatorische Abhängigkeiten."
Übersetzung:
Spring empfiehlt: "Stellen Sie immer eine Abhängigkeitsinjektion mit Konstruktoren in Ihrer Bohne her. Verwenden Sie immer Behauptungen, um Abhängigkeiten zu erzwingen".
Originaltext:
Modifizierte Schreibweise:
PS: Die Initialisierungsreihenfolge von Java-Variablen ist: statische Variablen oder statische Anweisungsblöcke – > Instanzvariablen oder Initialisierungsanweisungsblöcke – >Konstruktionsmethode – >@Autowired
Warum also den letzten Typ zur Mitgliedsvariable hinzufügen?
Im Internet gibt es eine folgende Erklärung: Der Umfang der Standardbohne in der Frühlingskonfiguration ist Singleton, was nach dem Start immer vorhanden ist. Deklarieren Sie das Objekt der Bohne dynamisch erstellt, indem Sie die Scope-Eigenschaft auf Prototype setzen. Wenn dein Dienst selbst jedoch ein Singleton ist, wird die Injektion nur einmal ausgeführt.
@Autowired selbst ein Singleton-Modus ist, wird er nur einmal beim Programmstart ausgeführt und initialisiert kein zweites Mal, selbst wenn kein Final definiert wird, sodass dieses Final bedeutungslos ist.
Dies kann dazu dienen, zu verhindern, dass der Konstruktor während der Ausführung des Programms erneut ausgeführt wird;
Oder vielleicht ist es leichter zu verstehen, außerdem initialisiert Final nur einmal, wenn das Programm beginnt.
|