Il primo application.yml profilo di configurazione è il seguente:
Progetti Maven pom.xml aggiungere pacchetti:
Crea un nuovo oggetto mappato con il seguente codice:
Il tipo di stringa deve richiedere un setter per ricevere i valori delle proprietà; mappe, collezioni e array non sono obbligatori
Usa @Autowired annotazioni per iniettare automaticamente, come mostrato nell'immagine seguente:
esConfig produce sempre nulla, ho cercato una soluzione a lungo ma non ha funzionato, ci sarà una soluzione qui sotto.
Creiamo un nuovo controller, il codice è il seguente:
L'iniezione ha successo e i valori del file di configurazione yml vengono ottenuti normalmente, come segue:
Le ragioni per cui EsClient non può essere iniettato con successo sono le seguenti:
Chiama una funzione di questa classe nel costruttore, e la variabile del @Autowired di questa classe viene usata in questa funzione.
Quindi ho pensato che potesse andare storto. Perché @Autowired deve aspettare che la classe venga costruita prima di poter essere impostata da riferimenti esterni. Pertanto, il tempo di iniezione di @Autowired deve essere successivo al tempo di esecuzione del costruttore. Soluzione:
Spring Team consiglia "Usa sempre l'iniezione di dipendenza basata su costruttori nei tuoi chicchi. Usa sempre le asserzioni per le dipendenze obbligatorie".
Traduzione:
Spring suggerisce "Stabilisci sempre l'iniezione di dipendenza con i costruttori nel tuo chicco. usare sempre asserzioni per forzare dipendenze".
Scrittura originale:
Scrittura modificata:
PS: L'ordine di inizializzazione delle variabili Java è: variabili statiche o blocchi di istruzioni statiche – > variabili di istanza o blocchi di istruzioni di inizializzazione – >metodo di costruzione – >@Autowired
Allora perché aggiungere il tipo finale alla variabile membro?
Su Internet c'è una spiegazione che segue: l'ambito del chicco predefinito nella configurazione a molla è singleton, che è sempre presente dopo l'avvio. Dichiarare che l'oggetto del bean è stato creato dinamicamente impostando la proprietà scope come prototipo. Tuttavia, se il tuo servizio stesso è un singleton, l'iniezione viene eseguita solo una volta.
@Autowired stesso è una modalità singleton, verrà eseguito solo una volta all'avvio del programma e non si avvierà una seconda volta anche se non definisce una modalità finale, quindi questo finale è privo di significato.
Può essere per impedire che il costruttore venga eseguito nuovamente mentre il programma è in esecuzione;
Oppure è più facile da capire, inoltre il finale si avvia solo una volta quando il programma inizia.
|