Ten eerste application.yml configuratieprofiel als volgt:
Maven-project pom.xml pakketten toevoegen:
Maak een nieuw gemapt object aan met de volgende code:
Het stringtype moet een setter nodig hebben om eigenschappenwaarden te ontvangen; Kaarten, verzamelingen en arrays zijn niet vereist
Gebruik @Autowired annotaties om automatisch te injecteren, zoals te zien is in de volgende afbeelding:
esConfig geeft altijd null uit, ik heb lang naar een oplossing gezocht, maar faalde, er zal hieronder een oplossing zijn.
Laten we een nieuwe controller aanmaken, de code is als volgt:
De injectie is succesvol, en de waarden van het yml-configuratiebestand worden normaal verkregen, als volgt:
De redenen waarom EsClient niet succesvol kan worden geïnjecteerd zijn als volgt:
Noem een functie van deze klasse in de constructor, en de variabele van de @Autowired van deze klasse wordt in deze functie gebruikt.
Dus dacht ik dat het misschien mis zou gaan. Omdat @Autowired moet wachten tot de klasse is geconstrueerd voordat deze uit externe referenties kan worden ingesteld. Daarom moet de injectietijd van @Autowired later zijn dan de uitvoeringstijd van de constructor. Oplossing:
Spring Team raadt aan: "Gebruik altijd constructor-gebaseerde afhankelijkheidsinjectie in je bonen. Gebruik altijd asserties voor verplichte afhankelijkheden".
Vertaling:
Spring stelt: "Stel altijd afhankelijkheidsinjectie vast met constructors in je boon. gebruik altijd asserties om afhankelijkheden af te dwingen".
Originele tekst:
Aangepast schrijfwerk:
PS: De initialisatievolgorde van Java-variabelen is: statische variabelen of statische statementblokken – > instantievariabelen of initialisatie-statementblokken – >constructiemethode – >@Autowired
Waarom zou je dan het laatste type toevoegen aan de lidvariabele?
Er is een uitleg op internet als volgt: De scope van de standaardboon in de veerconfiguratie is singleton, die er altijd is na het opstarten. Verklaar het object van de boon dynamisch gecreëerd door de scope-eigenschap op prototype te zetten. Als je service zelf echter een singleton is, wordt de injectie slechts één keer uitgevoerd.
@Autowired zelf een singleton-modus is, wordt deze slechts één keer uitgevoerd wanneer het programma start, en zal hij niet een tweede keer initialiseren, zelfs niet als er een final wordt gedefinieerd, dus deze final is betekenisloos.
Dit kan zijn om te voorkomen dat de constructor opnieuw wordt uitgevoerd terwijl het programma draait;
Of misschien is het makkelijker te begrijpen, plus dat de finale maar één keer wordt geïnitieerd wanneer het programma begint.
|