Först application.yml konfigurationsprofil är följande:
Maven-projektet pom.xml lägga till paket:
Skapa ett nytt mappat objekt med följande kod:
Strängtypen måste behöva en setter för att få egenskapsvärden; Kartor, samlingar och arrayer krävs inte
Använd @Autowired annotationer för att automatiskt injicera, som visas i följande bild:
esConfig ger alltid null, sökte efter en lösning länge, men misslyckades, det finns en lösning nedan.
Låt oss skapa en ny kontroller, koden är följande:
Injektionen lyckas, och värdena för yml-konfigurationsfilen erhålls normalt, enligt följande:
Anledningarna till att EsClient inte kan injiceras framgångsrikt är följande:
Kalla en funktion av denna klass i konstruktorn, och variabeln av @Autowired i denna klass används i denna funktion.
Så jag trodde att det kunde gå fel. Eftersom @Autowired måste vänta på att klassen ska konstrueras innan den kan sättas från externa referenser. Därför måste injektionstiden för @Autowired vara senare än exekveringstiden för konstruktorn. Lösning:
Spring Team rekommenderar "Använd alltid konstruktörbaserad beroendeinjektion i dina bönor." Använd alltid påståenden för obligatoriska beroenden".
Översättning:
Spring föreslår "Etablera alltid beroendeinjektion med konstruktörer i din böna. använd alltid påståenden för att tvinga fram beroenden".
Originaltext:
Modifierad text:
PS: Initialiseringsordningen för Java-variabler är: statiska variabler eller statiska satsblock – > instansvariabler eller initialiseringssatsblock – >konstruktionsmetod – >@Autowired
Så varför lägga till den sista typen till medlemsvariabeln?
Det finns en förklaring på internet som följer: Omfattningen av standardbönan i vårkonfigurationen är singleton, vilket alltid finns där efter uppstart. Deklarera att bönans objekt är dynamiskt skapat genom att sätta scope-egenskapen till prototype. Men om din tjänst i sig är en singleton, utförs injektionen bara en gång.
@Autowired i sig är ett singleton-läge kommer det bara att köras en gång när programmet startar, och det kommer inte att initiera en andra gång även om det inte definierar en final, så denna final är meningslös.
Det kan vara för att förhindra att konstruktorn körs igen medan programmet körs;
Eller så är det lättare att förstå, plus att final bara initieras en gång när programmet startar.
|