Primul application.yml profil de configurare este următorul:
Proiectul Maven pom.xml adăuga pachete:
Creează un nou obiect mapat cu următorul cod:
Tipul de șir trebuie să aibă nevoie de un setter pentru a primi valorile proprietăților; Hărțile, colecțiile și array-urile nu sunt necesare
Folosește @Autowired adnotări pentru a injecta automat, așa cum se arată în imaginea următoare:
esConfig afișează întotdeauna rezultatul null, am căutat o soluție mult timp, dar a eșuat, va apărea o soluție mai jos.
Să creăm un nou controler, codul este următorul:
Injectarea are succes, iar valorile fișierului de configurare yml sunt obținute normal, după cum urmează:
Motivele pentru care EsClient nu poate fi injectat cu succes sunt următoarele:
Cheamă o funcție a acestei clase în constructor, iar variabila @Autowired acestei clase este folosită în această funcție.
Așa că m-am gândit că ar putea merge prost. Pentru că @Autowired trebuie să aștepte ca clasa să fie construită înainte de a putea fi setată din referințe externe. Prin urmare, timpul de injectare al @Autowired trebuie să fie mai târziu decât timpul de execuție al constructorului. Soluție:
Spring Team recomandă "Folosește întotdeauna injecția de dependență bazată pe constructori în boabele tale. Folosiți întotdeauna aserții pentru dependențe obligatorii".
Traducere:
Spring sugerează: "Stabilește întotdeauna injecția de dependență cu constructori în boabe. folosiți întotdeauna aserții pentru a forța dependențele".
Scriere originală:
Scriere modificată:
PS: Ordinea de inițializare a variabilelor Java este: variabile statice sau blocuri statice de instrucțiuni – > variabile de instanță sau blocuri de instrucțiuni de inițializare – >metodă de construcție – >@Autowired
Deci, de ce să adaugi tipul final la variabila membru?
Există o explicație pe Internet astfel: Scopul boabului implicit în configurația arcului este singleton, care este întotdeauna prezent după pornire. Declară obiectul boabei ca fiind creat dinamic prin setarea proprietății scope ca prototip. Totuși, dacă serviciul tău este singleton, injecția se execută o singură dată.
@Autowired el însuși este un mod singleton, va fi executat o singură dată la pornirea programului și nu se va inițializa a doua oară chiar dacă nu definește o finală, deci această finală este lipsită de sens.
Poate fi pentru a preveni execuția constructorului din nou în timp ce programul rulează;
Sau poate e mai ușor de înțeles, plus că finalul se va inițializa o singură dată când începe programul.
|