Ensimmäinen application.yml konfiguraatioprofiili on seuraava:
Maven-projekti pom.xml lisää paketteja:
Luo uusi kartoitettu objekti seuraavalla koodilla:
Merkkijonotyypin täytyy tarvita asettaja saadakseen ominaisuusarvot; Karttoja, kokoelmia ja taulukoita ei tarvita
Käytä @Autowired annotaatioita automaattisesti injektioidaksesi seuraavassa kuvassa:
esConfig antaa aina null-tuloksen, olen etsinyt ratkaisua pitkään, mutta epäonnistunut, ratkaisu löytyy alta.
Luodaan uusi ohjain, koodi on seuraava:
Injektio onnistuu, ja yml-konfiguraatiotiedoston arvot saadaan normaalisti seuraavasti:
Syyt siihen, miksi EsClientia ei voida injektoida onnistuneesti, ovat seuraavat:
Kutsu tämän luokan funktio konstruktoriin, ja tämän luokan @Autowired muuttuja käytetään tässä funktiossa.
Joten ajattelin, että se voisi mennä pieleen. Koska @Autowired täytyy odottaa, että luokka rakennetaan, ennen kuin se voidaan asettaa ulkoisista lähteistä. Tästä syystä @Autowired:n injektioaika on oltava myöhempi kuin konstruktorin suoritusaika. Ratkaisu:
Spring Team suosittelee: "Käytä aina valmistajapohjaista riippuvuusinjektiota pavuissasi. Käytä aina väitteitä pakollisille riippuvuuksille".
Käännös:
Spring suosittelee: "Tee aina riippuvuuden injektiointi pavussasi valmistelijoilla. käytä aina väitteitä riippuvuuksien pakottamiseen".
Alkuperäinen kirjoitus:
Muokattu kirjoitus:
PS: Java-muuttujien alustusjärjestys on: staattiset muuttujat tai staattiset lauseblokit – > instanssimuuttujat tai aloituslauselohkot – >rakennusmenetelmä – >@Autowired
Miksi siis lisätä lopullinen tyyppi jäsenmuuttujaan?
Internetissä on selitys seuraavasti: Oletuspavun laajuus jousikokoonpanossa on singleton, joka on aina läsnä käynnistyksen jälkeen. Ilmoita pavun objekti dynaamisesti luoduksi asettamalla skoopin ominaisuus prototyyppiksi. Jos palvelusi itsessään on singleton, injektio suoritetaan vain kerran.
@Autowired itsessään on singleton-tila, se suoritetaan vain kerran ohjelman käynnistyessä, eikä se käynnisty toista kertaa, vaikka se ei määrittele finaalia, joten tämä finaali on merkityksetön.
Se voi olla estämään konstruktorin uudelleenkäynnistys ohjelman ollessa käynnissä;
Tai ehkä se on helpompi ymmärtää, ja lopullinen käynnistyy vain kerran, kun ohjelma alkaa.
|