Guide til @ConfigurationProperties in Spring Boot

1. Introduksjon

Spring Boot har mange nyttige funksjoner, inkludert ekstern konfigurasjon og enkel tilgang til egenskaper definert i egenskapsfiler. En tidligere opplæring beskrev forskjellige måter dette kan gjøres på.

Vi skal nå utforske @ConfigurationProperties kommentar mer detaljert.

2. Oppsett

Denne opplæringen bruker et ganske standard oppsett. Vi begynner med å legge til spring-boot-starter-parent som foreldre i vår pom.xml:

 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE 

For å kunne validere egenskaper som er definert i filen, trenger vi også en implementering av JSR-303, og dvalemodus er en av dem.

La oss legge det til vårt pom.xml også:

 org.hibernate hibernate-validator 6.0.16.Final 

Siden "Komme i gang med dvalemodus" har flere detaljer.

3. Enkle egenskaper

Den offisielle dokumentasjonen anbefaler at vi isolerer konfigurasjonsegenskaper i separate POJOer.

Så la oss begynne med å gjøre det:

@Configuration @ConfigurationProperties (prefix = "mail") offentlig klasse ConfigProperties {private String hostName; privat int port; private String fra; // standard getters og setters}

Vi bruker @Konfigurasjon slik at våren skaper en vårbønne i applikasjonssammenheng.

@ConfigurationProperties fungerer best med hierarkiske egenskaper som alle har samme prefiks; Derfor legger vi til et prefiks av post.

Spring-rammeverket bruker standard Java-bønnesettere, så vi må erklære settere for hver av egenskapene.

Merk: Hvis vi ikke bruker @Konfigurasjon i POJO, så må vi legge til @EnableConfigurationProperties (ConfigProperties.class) i den viktigste vårapplikasjonsklassen for å binde eiendommene til POJO:

@SpringBootApplication @EnableConfigurationProperties (ConfigProperties.class) public class EnableConfigurationDemoApplication {public static void main (String [] args) {SpringApplication.run (EnableConfigurationDemoApplication.class, args); }}

Det er det! Spring vil automatisk binde alle eiendommer som er definert i eiendomsfilen vår som har prefikset post og samme navn som et av feltene i ConfigProperties klasse.

Våren bruker noen avslappede regler for bindende egenskaper. Som et resultat er følgende varianter bundet til eiendommen vertsnavn:

mail.hostName mail.hostname mail.host_name mail.host-name mail.HOST_NAME 

Derfor kan vi bruke følgende egenskapsfil til å angi alle feltene:

#Enkle egenskaper [e-postbeskyttet] mail.port = 9000 [e-postbeskyttet] 

3.1. Vårstøvel 2.2

Fra og med Spring Boot 2.2, finner og registrerer Spring @ConfigurationProperties klasser via klassesti skanning. Derfor, det er ikke nødvendig å kommentere slike klasser med @Komponent (og andre metaanmerkninger som @Configuration),eller til og med bruke @EnableConfigurationProperties:

@ConfigurationProperties (prefix = "mail") offentlig klasse ConfigProperties {private String hostName; privat int port; private String fra; // standard getters og setters} 

Klassesti skanneren aktivert av @SpringBootApplication finner ConfigProperties klasse, selv om vi ikke kommenterte denne timen med @Komponent.

I tillegg kan vi bruke de @ConfigurationPropertiesScan kommentar for å skanne egendefinerte steder for konfigurasjonseiendomsklasser:

@SpringBootApplication @ConfigurationPropertiesScan ("com.baeldung.configurationproperties") public class EnableConfigurationDemoApplication {public static void main (String [] args) {SpringApplication.run (EnableConfigurationDemoApplication.class, args); }}

På denne måten vil Spring bare se etter konfigurasjonseiendomsklasser i com.baeldung.properties pakke.

4. Nestede eiendommer

Vi kan ha nestede eiendommer i Lister, kart, og Klasser.

La oss lage et nytt Legitimasjonserklæring klasse å bruke for noen nestede egenskaper:

Legitimasjonsinformasjon for offentlig klasse {private String authMethod; privat streng brukernavn; privat strengpassord; // standard getters og setters}

Vi må også oppdatere ConfigProperties klasse for å bruke en Liste, en Kart, og Legitimasjonserklæring klasse:

offentlig klasse ConfigProperties {privat strengvert; privat int port; private String fra; private Liste standardmottakere; privat Kart tilleggsoverskrifter; privat legitimasjon legitimasjon; // standard getters og setters}

Følgende egenskaper-fil vil angi alle feltene:

#Enkle egenskaper [e-postbeskyttet] mail.port = 9000 [e-postbeskyttet] # Listeegenskaper mail.defaultRecipients [0] [email protected] mail.defaultRecipients [1] [email protected] #Map Properties mail.additionalHeaders.redelivery = true mail .additionalHeaders.secure = true #Object egenskaper mail.credentials.username = john mail.credentials.password = passord mail.credentials.authMethod = SHA1

5. Bruke @ConfigurationProperties på en @Bønne Metode

Vi kan også bruke @ConfigurationProperties kommentar den @Bønne-anmerkede metoder.

Denne tilnærmingen kan være spesielt nyttig når vi ønsker å binde egenskaper til en tredjepartskomponent som er utenfor vår kontroll.

La oss lage en enkel Punkt klasse som vi skal bruke i neste eksempel:

public class Item {private String name; privat int størrelse; // standard getters og setters}

La oss nå se hvordan vi kan bruke @ConfigurationProperties på en @Bønne metode for å binde eksternaliserte egenskaper til Punkt forekomst:

@Configuration public class ConfigProperties {@Bean @ConfigurationProperties (prefix = "item") public Item item () {return new Item (); }}

Følgelig vil ethvert element-prefiks eiendom bli kartlagt til Punkt instans administrert av vårkonteksten.

6. Validering av eiendom

@ConfigurationProperties gir validering av egenskaper ved bruk av JSR-303-formatet. Dette tillater alle slags pene ting.

La oss for eksempel lage vertsnavn eiendommen obligatorisk:

@NotBlank privat streng vertsnavn;

Neste, la oss lage authMethod eiendom fra 1 til 4 tegn lang:

@Length (max = 4, min = 1) private String authMethod;

Og så havn eiendom fra 1025 til 65536:

@Min (1025) @Max (65536) privat int-port; 

Til slutt, fra eiendommen må samsvare med et e-postadresseformat:

@Pattern (regexp = "^ [a-z0-9 ._% + -] [e-postbeskyttet] [a-z0-9 .-] + \. [Az] {2,6} $") privat streng fra ; 

Dette hjelper oss med å redusere mye av hvis - annet forholdene i koden vår, og får den til å se mye renere og mer konsis ut.

Hvis noen av disse valideringene mislykkes, vil ikke hovedprogrammet begynne med en IllegalStateException.

Hibernate Validation framework bruker standard Java bønneetter og settere, så det er viktig at vi erklærer getters og settere for hver av egenskapene.

7. Eiendomskonvertering

@ConfigurationProperties støtter konvertering for flere typer binding av egenskapene til deres tilsvarende bønner.

7.1. Varighet

Vi begynner med å se på konvertering av eiendommer til Varighet gjenstander.

Her har vi to typefelt Varighet:

@ConfigurationProperties (prefix = "conversion") offentlig klasse PropertyConversion {private Varighet timeInDefaultUnit; privat VarighetstidInNano; ...}

Dette er vår eiendomsfil:

conversion.timeInDefaultUnit = 10 conversion.timeInNano = 9ns

Som et resultat, feltet timeInDefaultUnit vil ha en verdi på 10 millisekunder, og timeInNano vil ha en verdi på 9 nanosekunder.

De støttede enhetene er ns, us, ms, s, m, h og d for henholdsvis nanosekunder, mikrosekunder, millisekunder, sekunder, minutter, timer og dager.

Standardenheten er millisekunder, noe som betyr at hvis vi ikke spesifiserer en enhet ved siden av den numeriske verdien, vil Spring konvertere verdien til millisekunder.

Vi kan også overstyre standardenheten ved hjelp av @DurationUnit:

@DurationUnit (ChronoUnit.DAYS) privat Varighet timeInDays;

Dette er den tilsvarende egenskapen:

conversion.timeInDays = 2

7.2. DataSize

Tilsvarende Spring Boot @ConfigurationProperties støtter DataSize type konvertering.

La oss legge til tre felt av typen DataSize:

private DataSize sizeInDefaultUnit; privat DataSize størrelseInGB; @DataSizeUnit (DataUnit.TERABYTES) privat DataSize sizeInTB;

Dette er de tilsvarende egenskapene:

conversion.sizeInDefaultUnit = 300 conversion.sizeInGB = 2 GB conversion.sizeInTB = 4

I dette tilfellet sizeInDefaultUnit verdien vil være 300 byte, da standardenheten er byte.

De støttede enhetene er B, KB, MB, GB, og TB. Vi kan også overstyre standardenheten ved hjelp av @DataSizeUnit.

7.3. Tilpasset Konverter

Vi kan også legge til vår egen skikk Konverter for å støtte konvertering av en eiendom til en bestemt klassetype.

La oss legge til en enkel klasse Ansatt:

offentlig klasse Ansatt {privat strengnavn; privat dobbeltlønn; }

Deretter oppretter vi en tilpasset omformer for å konvertere denne egenskapen:

konvertering. ansatt = john, 2000

Vi konverterer den til en fil av typen Ansatt:

privat ansatt ansatt;

Vi må implementere Konverter grensesnitt, da bruk @ConfigurationPropertiesBinding kommentar for å registrere vår skikk Konverter:

@Component @ConfigurationPropertiesBinding offentlig klasse EmployeeConverter implementerer Converter {@Override public Employee convert (String from) {String [] data = from.split (","); returner ny ansatt (data [0], Double.parseDouble (data [1])); }}

8. Uforanderlig @ConfigurationProperties Bindende

Fra og med Spring Boot 2.2, vi kan bruke @ConstructorBinding kommentar for å binde konfigurasjonsegenskapene våre.

Dette betyr egentlig det @ConfigurationProperties-anmerkte klasser kan nå være uforanderlige.

@ConfigurationProperties (prefix = "mail.credentials") @ConstructorBinding public class ImmutableCredentials {private final String authMethod; privat slutt String brukernavn; privat slutt String passord; public ImmutableCredentials (String authMethod, String username, String password) {this.authMethod = authMethod; this.username = brukernavn; this.password = passord; } public String getAuthMethod () {return authMethod; } public String getUsername () {return username; } offentlig streng getPassword () {returpassord; }}

Som vi kan se, når du bruker @ConstructorBinding, vi må gi konstruktøren alle parametrene vi vil binde.

Merk at alle feltene i ImmutableCredentials er endelige. Det er heller ingen settermetoder.

Videre er det viktig å understreke det for å bruke konstruktorbindingen, må vi aktivere konfigurasjonsklassen vår eksplisitt med @EnableConfigurationProperties eller med @ConfigurationPropertiesScan .

9. Konklusjon

I denne artikkelen undersøkte vi @ConfigurationProperties kommentar og fremhevet noen av de nyttige funksjonene den gir, som avslappet binding og Bean Validation.

Som vanlig er koden tilgjengelig på Github.


$config[zx-auto] not found$config[zx-overlay] not found