Injiser et kart fra en YAML-fil med våren
1. Oversikt
I denne raske opplæringen skal vi se nærmere på hvordan du injiserer et kart fra en YAML-fil i Spring Boot.
Først begynner vi med litt innsikt i YAML-filer i Spring Framework. Deretter viser vi gjennom et praktisk eksempel hvordan vi binder YAML-egenskaper til en Kart.
2. YAML-filer i Spring Framework
Å bruke YAML-filer til å lagre eksterne konfigurasjonsdata er en vanlig praksis blant Spring-utviklere. I utgangspunktet, Spring støtter YAML-dokumenter som et alternativ til egenskaper og bruker SnakeYAML under panseret for å analysere dem.
Uten videre, la oss se hvordan en typisk YAML-fil ser ut:
server: port: 8090 applikasjon: navn: minapplikasjons url: //myapplication.com
Som vi kan se, er YAML-filen er selvforklarende og mer lesbar for mennesker. Faktisk gir YAML en fancy og kortfattet måte å lagre hierarkiske konfigurasjonsdata på.
Som standard leser Spring Boot konfigurasjonsegenskaper fra application.properties eller application.yml ved oppstart av applikasjonen. Imidlertid kan vi bruke @PropertySource for å laste en tilpasset YAML-fil.
Nå som vi er kjent med hva en YAML-fil er, la oss se hvordan vi injiserer YAML-egenskaper som en Kart i Spring Boot.
3. Hvordan injisere en Kart fra en YAML-fil
Spring Boot har tatt dataeksternalisering til neste nivå ved å gi en praktisk kommentar kalt @ConfigurationProperties. Denne kommentaren er introdusert for å enkelt injisere eksterne egenskaper fra konfigurasjonsfiler direkte i Java-objekter.
I denne delen skal vi dekke grundig hvordan du binder YAML-egenskaper til en bønneklasse ved hjelp av @ConfigurationProperties kommentar.
La oss først definere noen nøkkelverdier i application.yml:
server: applikasjon: navn: InjectMapFromYAML url: //injectmapfromyaml.dev beskrivelse: Slik injiserer du et kart fra en YAML-fil i Spring Boot-konfigurasjon: ips: - 10.10.10.10 - 10.10.10.11 - 10.10.10.12 - 10.10.10.13 filsystem: - / dev / root - / dev / md2 - / dev / md4 brukere: root: brukernavn: root passord: rootpass gjest: brukernavn: gjest passord: gjest pass
I dette eksemplet vil vi prøve å kartlegge applikasjon inn i en enkel Kart. På samme måte injiserer vi config detaljer som en Kart
For det andre, la oss lage en bønneklasse - Serveregenskaper - for å kapsle logikken for å binde konfigurasjonsegenskapene våre til Karts:
@Component @ConfigurationProperties (prefix = "server") offentlig klasse ServerProperties {private Map-applikasjon; privat kart config; private Map-brukere; // getters and setters public static class Credential {private String username; privat strengpassord; // getters og setters}}
Som vi kan se, dekorerte vi Serveregenskaper klasse med @ConfigurationProperties. På den måten ber vi Spring om å kartlegge alle egenskapene med det angitte prefikset til et objekt fra Serveregenskaper.
Husk at appen vår også må være aktivert for konfigurasjonsegenskaper, selv om dette gjøres automatisk i de fleste Spring Boot-applikasjoner.
Til slutt, la oss teste om YAML-egenskapene våre er riktig injisert som Karts:
@RunWith (SpringRunner.class) @SpringBootTest klasse MapFromYamlIntegrationTest {@Autowired private ServerProperties serverProperties; @Test offentlig ugyldig nårYamlFileProvidedThenInjectSimpleMap () {assertThat (serverProperties.getApplication ()) .containsOnlyKeys ("name", "url", "description"); assertThat (serverProperties.getApplication () .get ("name")). isEqualTo ("InjectMapFromYAML"); } @Test offentlig ugyldig nårYamlFileProvidedThenInjectComplexMap () {assertThat (serverProperties.getConfig ()). HasSize (2); assertThat (serverProperties.getConfig () .get ("ips") .get (0)). isEqualTo ("10.10.10.10"); assertThat (serverProperties.getUsers () .get ("root") .getUsername ()). isEqualTo ("root"); }}
4. @ConfigurationProperties vs. @Verdi
La oss nå gjøre en rask sammenligning av @ConfigurationProperties og @Verdi.
Til tross for at begge kommentarene kan brukes til å injisere egenskaper fra konfigurasjonsfiler, de er ganske forskjellige. Den største forskjellen mellom disse to kommentarene er at hver og en tjener et annet formål.
Kort oppsummert, @Value tillater oss å injisere direkte en bestemt egenskap verdi med nøkkelen. Derimot, @ConfigurationProperties kommentar binder flere egenskaper til et bestemt objekt og gir tilgang til egenskapene gjennom det tilordnede objektet.
Generelt anbefaler Spring å bruke @ConfigurationProperties over @Verdi når det gjelder å injisere konfigurasjonsdata. @ConfigurationProperties tilbyr en flott måte å sentralisere og gruppere konfigurasjonsegenskaper i et strukturert objekt som vi senere kan injisere i andre bønner.
5. Konklusjon
For å oppsummere forklarte vi først hvordan man injiserer en Kart fra en YAML-fil i Spring Boot. Deretter markerte vi forskjellen mellom @ConfigurationProperties og @Verdi.
Som vanlig er hele kildekoden for artikkelen tilgjengelig på GitHub.