Vodič za @ConfigurationProperties u Spring Boot-u

1. Uvod

Spring Boot ima brojne korisne značajke, uključujući eksternalizirana konfiguracija i jednostavan pristup svojstvima definiranim u datotekama svojstava. Raniji tutorial opisivao je razne načine na koje se to moglo učiniti.

Sada ćemo istražiti @ConfigurationProperties bilješka detaljnije.

2. Postavljanje

Ovaj se vodič koristi prilično standardnim postavkama. Počinjemo dodavanjem proljeće-čizma-starter-roditelj kao roditelj u našem pom.xml:

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

Da bismo mogli provjeriti svojstva definirana u datoteci, također nam je potrebna implementacija JSR-303 i hibernacijski validator je jedan od njih.

Dodajmo ga našem pom.xml također:

 org.hibernate hibernate-validator 6.0.16.Finalni 

Stranica "Početak rada s Hibernate Validatorom" sadrži više pojedinosti.

3. Jednostavna svojstva

Službena dokumentacija savjetuje da izoliramo svojstva konfiguracije u zasebne POJO-ove.

Pa krenimo od toga:

@Configuration @ConfigurationProperties (prefix = "mail") javna klasa ConfigProperties {private StringName domaćina; privatna int luka; privatni niz od; // standardni geteri i postavljači}

Koristimo @Konfiguracija tako da Spring stvara Spring grah u kontekstu aplikacije.

@ConfigurationProperties najbolje radi s hijerarhijskim svojstvima koja svi imaju isti prefiks; stoga dodajemo prefiks od pošta.

Spring framework koristi standardne Java grah postavljače, pa moramo deklarirati postavljače za svako svojstvo.

Napomena: Ako ne koristimo @Konfiguracija u POJO, onda moramo dodati @EnableConfigurationProperties (ConfigProperties.class) u glavnoj proljetnoj klasi aplikacije za povezivanje svojstava u POJO:

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

To je to! Spring će automatski povezati bilo koje svojstvo definirano u našoj datoteci svojstava koje ima prefiks pošta i isto ime kao jedno od polja u ConfigProperties razred.

Spring koristi neka opuštena pravila za svojstva vezivanja. Kao rezultat, sve su sljedeće varijacije vezane uz svojstvo hostName:

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

Stoga možemo koristiti sljedeću datoteku svojstava za postavljanje svih polja:

# Jednostavna svojstva [zaštićena e-poštom] mail.port = 9000 [zaštićena e-poštom] 

3.1. Proljetna čizma 2.2

Od Spring Boot 2.2, Spring pronalazi i registrira @ConfigurationProperties predavanja putem skeniranja staze. Stoga, nema potrebe za označavanjem takvih klasa @Komponenta (i druge meta-bilješke poput @Configuration),ili čak koristiti @EnableConfigurationProperties:

@ConfigurationProperties (prefix = "mail") javna klasa ConfigProperties {private StringName domaćina; privatna int luka; privatni niz od; // standardni geteri i postavljači} 

Skener staze za učenje omogućio @SpringBootApplication pronalazi ConfigProperties klase, iako ovom razredu nismo dodavali napomene @Komponenta.

Osim toga, možemo koristiti the @ConfigurationPropertiesScan napomena za skeniranje prilagođenih lokacija za klase svojstava konfiguracije:

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

Na ovaj će način Spring potražiti klase svojstava konfiguracije samo u com.baeldung.properties paket.

4. Ugniježđena svojstva

Možemo imati ugniježđena svojstva u Popisi, Karte, i Nastava.

Stvorimo novo Vjerodajnice klasa za neka ugniježđena svojstva:

vjerodajnice javne klase {private String authMethod; privatno korisničko ime niza; privatna lozinka za niz; // standardni geteri i postavljači}

Također moramo ažurirati ConfigProperties razred za korištenje a Popis, a Karta, i Vjerodajnice razred:

javna klasa ConfigProperties {private String host; privatna int luka; privatni niz od; privatni popis defaultRecipients; privatna karta AdditionalHeaders; vjerodajnice za privatne vjerodajnice; // standardni geteri i postavljači}

Sljedeća datoteka svojstava postavit će sva polja:

# Jednostavna svojstva [zaštićena e-poštom] mail.port = 9000 [zaštićena e-poštom] # Svojstva popisa mail.defaultRecipients [0] [zaštićena e-poštom] mail.defaultRecipients [1] [zaštićena e-poštom] # Svojstva mape mail.additionalHeaders.redelivery = true mail .additionalHeaders.secure = true # Svojstva objekta mail.credentials.username = john mail.credentials.password = lozinka mail.credentials.authMethod = SHA1

5. Korištenje @ConfigurationProperties na a @Grah Metoda

Također možemo koristiti @ConfigurationProperties bilješka na @Grah-anotirane metode.

Ovaj pristup može biti osobito koristan kada želimo vezati svojstva na komponentu treće strane koja je izvan naše kontrole.

Stvorimo jednostavan Artikal klase koju ćemo upotrijebiti u sljedećem primjeru:

predmet javne klase {naziv privatnog niza; privatna int veličina; // standardni geteri i postavljači}

Sada da vidimo kako možemo koristiti @ConfigurationProperties na a @Grah metoda za povezivanje eksternaliziranih svojstava s Artikal primjer:

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

Slijedom toga, svako svojstvo s prefiksom stavke bit će mapirano u Artikal instance kojom upravlja kontekst Proljeća.

6. Provjera valjanosti imovine

@ConfigurationProperties pruža provjeru svojstava korištenjem formata JSR-303. To omogućuje sve vrste urednih stvari.

Na primjer, napravimo hostName imovina obavezna:

@NotBlank privatni niz hostName;

Dalje, napravimo authMethod svojstvo od 1 do 4 znaka:

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

Onda luka nekretnina od 1025 do 65536:

@Min (1025) @Max (65536) privatni int port; 

Napokon, iz svojstvo mora odgovarati formatu adrese e-pošte:

@Pattern (regexp = "^ [a-z0-9 ._% + -] [email protected] [a-z0-9 .-] + \. [Az] {2,6} $") privatni niz od ; 

To nam pomaže smanjiti puno ako - inače uvjetima u našem kodu i čini ga mnogo čišćim i sažetijim.

Ako bilo koja od ovih provjera ne uspije, tada glavna aplikacija ne bi mogla započeti s IllegalStateException.

Okvir hibernacijske provjere koristi standardne jahače i postavljače bean zrna, stoga je važno da deklariramo getere i postavljače za svako svojstvo.

7. Konverzija imovine

@ConfigurationProperties podržava pretvorbu za više vrsta vezivanja svojstava na odgovarajuće grah.

7.1. Trajanje

Za početak ćemo razmotriti pretvaranje svojstava u Trajanje predmeta.

Ovdje imamo dva polja tipa Trajanje:

@ConfigurationProperties (prefix = "conversion") javna klasa PropertyConversion {private Duration timeInDefaultUnit; privatno Vrijeme trajanjaInNano; ...}

Ovo je naša datoteka svojstava:

conversion.timeInDefaultUnit = 10 conversion.timeInNano = 9ns

Kao rezultat toga, polje timeInDefaultUnit imat će vrijednost od 10 milisekundi i timeInNano imat će vrijednost 9 nanosekundi.

Podržane jedinice su ns, us, ms, s, m, h i d za nanosekunde, mikrosekunde, milisekunde, sekunde, minute, sate i dane.

Zadana jedinica je milisekunde, što znači da ako ne odredimo jedinicu pored numeričke vrijednosti, Spring će pretvoriti vrijednost u milisekunde.

Također možemo poništiti zadanu jedinicu pomoću @DurationUnit:

@DurationUnit (ChronoUnit.DAYS) private Trajanje timeInDays;

Ovo je odgovarajuće svojstvo:

pretvorba.timeInDays = 2

7.2. DataSize

Slično tome, Spring Boot @ConfigurationProperties podupire DataSize pretvorba tipa.

Dodajmo tri polja tipa DataSize:

private DataSize sizeInDefaultUnit; private DataSize sizeInGB; @DataSizeUnit (DataUnit.TERABYTES) private DataSize sizeInTB;

Ovo su odgovarajuća svojstva:

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

U ovom slučaju, sizeInDefaultUnit vrijednost će biti 300 bajtova, jer su zadana jedinica bajtovi.

Podržane jedinice su B, KB, MB, GB, i TB. Također možemo poništiti zadanu jedinicu pomoću @DataSizeUnit.

7.3. Prilagođen Konverter

Možemo dodati i vlastiti običaj Konverter za podršku pretvaranju svojstva u određeni tip klase.

Dodajmo jednostavnu klasu Zaposlenik:

zaposlenik u javnoj klasi {private String name; privatna dvostruka plaća; }

Zatim ćemo stvoriti prilagođeni pretvarač za pretvaranje ovog svojstva:

pretvorba.employee = john, 2000

Pretvorit ćemo ga u datoteku tipa Zaposlenik:

privatni zaposlenik zaposlenik;

Morat ćemo implementirati Konverter sučelje, dakle koristiti @ConfigurationPropertiesBinding napomena da bismo registrirali naš običaj Konverter:

@Component @ConfigurationPropertiesBinding javna klasa EmployeeConverter implementira Converter {@Override public Employee convert (String from) {String [] data = from.split (","); vratiti novog zaposlenika (podaci [0], Double.parseDouble (podaci [1])); }}

8. Nepromjenjiv @ConfigurationProperties Uvez

Od Spring Boota 2.2, možemo koristiti @ConstructorBinding napomena koja veže naša svojstva konfiguracije.

To u biti znači da @ConfigurationProperties-komentirane klase sada mogu biti nepromjenjive.

@ConfigurationProperties (prefix = "mail.credentials") @ConstructorBinding javna klasa ImmutableCredentials {private final String authMethod; privatno konačno korisničko ime niza; privatna konačna lozinka za niz; javni ImmutableCredentials (String authMethod, String korisničko ime, String lozinka) {this.authMethod = authMethod; this.username = korisničko ime; this.password = lozinka; } javni String getAuthMethod () {return authMethod; } javni String getUsername () {return korisničko ime; } javni String getPassword () {return lozinka; }}

Kao što vidimo, prilikom korištenja @ConstructorBinding, moramo konstruktoru pružiti sve parametre koje želimo povezati.

Imajte na umu da su sva polja Nepromjenjive vjerodajnice su konačni. Također, ne postoje metode postavljača.

Nadalje, važno je to naglasiti da bismo koristili vezivanje konstruktora, moramo izričito omogućiti našu konfiguracijsku klasu bilo s @EnableConfigurationProperties ili s @ConfigurationPropertiesScan .

9. Zaključak

U ovom smo članku istražili @ConfigurationProperties napomena i istaknuo neke korisne značajke koje pruža, poput opuštenog vezivanja i provjere graha.

Kao i obično, kôd je dostupan na Githubu.