Injicér et kort fra en YAML-fil med Spring

1. Oversigt

I denne hurtige vejledning skal vi se nærmere på hvordan man injicerer et kort fra en YAML-fil i Spring Boot.

Først starter vi med lidt indsigt i YAML-filer i Spring Framework. Derefter viser vi gennem et praktisk eksempel, hvordan man binder YAML-egenskaber til en Kort.

2. YAML-filer i foråret

Brug af YAML-filer til at gemme eksterne konfigurationsdata er en almindelig praksis blandt Spring-udviklere. I bund og grund, Spring understøtter YAML-dokumenter som et alternativ til egenskaber og bruger SnakeYAML under emhætten til at analysere dem.

Uden yderligere ado, lad os se, hvordan en typisk YAML-fil ser ud:

server: port: 8090 applikation: navn: minapplikation url: //myapplication.com

Som vi kan se, er YAML-filen er selvforklarende og mere menneskelig læsbar. Faktisk giver YAML en fancy og kortfattet måde at gemme hierarkiske konfigurationsdata på.

Spring Boot læser som standard konfigurationsegenskaber fra application.properties eller ansøgning.yml ved opstart af applikationen. Vi kan dog bruge @PropertySource for at indlæse en brugerdefineret YAML-fil.

Nu hvor vi er fortrolige med, hvad en YAML-fil er, lad os se, hvordan vi injicerer YAML-egenskaber som en Kort i Spring Boot.

3. Sådan injiceres en Kort fra en YAML-fil

Spring Boot har ført dataeksternalisering til det næste niveau ved at give en praktisk kommentar kaldet @ConfigurationProperties. Denne kommentar introduceres for nemt at indsprøjte eksterne egenskaber fra konfigurationsfiler direkte i Java-objekter.

I dette afsnit skal vi dække dybtgående, hvordan man binder YAML-egenskaber til en bønneklasse ved hjælp af @ConfigurationProperties kommentar.

Lad os først definere nogle nøgleværdieegenskaber i ansøgning.yml:

server: applikation: navn: InjectMapFromYAML url: //injectmapfromyaml.dev beskrivelse: Sådan indsprøjtes et kort fra en YAML-fil i Spring Boot-konfiguration: ips: - 10.10.10.10 - 10.10.10.11 - 10.10.10.12 - 10.10.10.13 filsystem: - / dev / root - / dev / md2 - / dev / md4 brugere: root: brugernavn: root adgangskode: rootpass gæst: brugernavn: gæst adgangskode: gæst adgang

I dette eksempel forsøger vi at kortlægge Ansøgning ind i en simpel Kort. På samme måde injicerer vi config detaljer som en Kort, og brugere som en Kort med Snor nøgler og objekter, der tilhører en brugerdefineret klasse - Legitimationsoplysninger - som værdier.

For det andet, lad os oprette en bønneklasse - Serverejendomme - at indkapsle logikken i at binde vores konfigurationsegenskaber til Korts:

@Component @ConfigurationProperties (prefix = "server") offentlig klasse ServerProperties {private Map-applikationer; privat kort config private kortbrugere; // getters and setters public static class Credential {private String username; privat strengadgangskode; // getters og setters}}

Som vi kan se, dekorerede vi Serveregenskaber klasse med @ConfigurationProperties. På den måde beder vi Spring om at kortlægge alle egenskaberne med det specificerede præfiks til et objekt fra Serveregenskaber.

Husk, at vores app også skal være aktiveret for konfigurationsegenskaber, selvom dette gøres automatisk i de fleste Spring Boot-applikationer.

Lad os endelig teste, om vores YAML-egenskaber injiceres korrekt som Korts:

@RunWith (SpringRunner.class) @SpringBootTest klasse MapFromYamlIntegrationTest {@Autowired private ServerProperties serverProperties; @Test offentlig ugyldig nårYamlFileProvidedThenInjectSimpleMap () {assertThat (serverProperties.getApplication ()) .containsOnlyKeys ("navn", "url", "beskrivelse"); assertThat (serverProperties.getApplication () .get ("navn")). 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. @Værdi

Lad os nu lave en hurtig sammenligning af @ConfigurationProperties og @Værdi.

På trods af at begge annoteringer kan bruges til at indsprøjte egenskaber fra konfigurationsfiler, de er ret forskellige. Den største forskel mellem disse to kommentarer er, at hver og en tjener et andet formål.

Kort sagt, @Value giver os mulighed for direkte at indsprøjte en bestemt ejendom værdi ved nøglen. Imidlertid, @ConfigurationProperties annotation binder flere egenskaber til et bestemt objekt og giver adgang til egenskaberne gennem det kortlagte objekt.

Generelt anbefaler Spring at bruge @ConfigurationProperties over @Værdi når det kommer til indsprøjtning af konfigurationsdata. @ConfigurationProperties tilbyder en fantastisk måde at centralisere og gruppere konfigurationsegenskaber i et struktureret objekt, som vi senere kan injicere i andre bønner.

5. Konklusion

For at opsummere det forklarede vi først, hvordan man injicerer en Kort fra en YAML-fil i Spring Boot. Derefter fremhævede vi forskellen mellem @ConfigurationProperties og @Værdi.

Som sædvanlig er den komplette kildekode til artiklen tilgængelig på GitHub.