Pirmā application.yml konfigurācijas profils ir šāds:
Maven projekts pom.xml pievienot pakotnes:
Izveidojiet jaunu kartētu objektu ar šādu kodu:
Virknes tipam ir jābūt iestatītājam, lai saņemtu rekvizītu vērtības; Kartes, kolekcijas un masīvi nav nepieciešami
Izmantojiet @Autowired anotācijas, lai automātiski injicētu, kā parādīts nākamajā attēlā:
esConfig vienmēr izvada nulli, ilgu laiku meklēja risinājumu, bet neizdevās, zemāk būs risinājums.
Izveidosim jaunu kontrolieri, kods ir šāds:
Injekcija ir veiksmīga, un yml konfigurācijas faila vērtības tiek iegūtas normāli, šādi:
Iemesli, kāpēc EsClient nevar veiksmīgi injicēt, ir šādi:
Izsauciet šīs klases funkciju konstruktorā, un šajā funkcijā tiek izmantots šīs klases @Autowired mainīgais.
Tāpēc es domāju, ka tas varētu noiet greizi. Jo @Autowired ir jāgaida, līdz klase tiks izveidota, pirms to var iestatīt no ārējām atsaucēm. Tāpēc @Autowired injekcijas laikam jābūt vēlākam par konstruktora izpildes laiku. Šķīdums:
Pavasara komanda iesaka "Vienmēr izmantojiet konstruktoru balstītu atkarības injekciju pupiņās. Vienmēr izmantojiet apgalvojumus par obligātajām atkarībām".
Tulkošana:
Pavasaris iesaka: "Vienmēr izveidojiet atkarības injekciju ar konstruktoriem pupiņās. vienmēr izmantojiet apgalvojumus, lai piespiestu atkarības".
Oriģinālais raksts:
Modificēta rakstīšana:
PS: Java mainīgo inicializācijas secība ir: statiskie mainīgie vai statiskie priekšrakstu bloki - > instances mainīgie vai inicializācijas paziņojumu bloki - >konstrukcijas metode - >@Autowired
Tātad, kāpēc pievienot galīgo tipu dalībnieka mainīgajam?
Internetā ir šāds skaidrojums: Noklusējuma pupiņu apjoms pavasara konfigurācijā ir singletons, kas vienmēr ir pēc startēšanas. Paziņojiet, ka pupiņas objekts ir dinamiski izveidots, iestatot tvēruma rekvizītu uz prototipu. Tomēr, ja jūsu pakalpojums pats par sevi ir singleton, injekcija tiek veikta tikai vienu reizi.
@Autowired pats par sevi ir vientuļš režīms, tas tiks izpildīts tikai vienu reizi, kad programma sāksies, un tas netiks inicializēts otro reizi, pat ja tas nedefinē finālu, tāpēc šis fināls ir bezjēdzīgs.
Tas var būt, lai novērstu konstruktora atkārtotu izpildi, kamēr programma darbojas;
Vai varbūt tas ir vieglāk saprotams, kā arī galīgais tiks inicializēts tikai vienu reizi, kad programma tiek startēta.
|