Sprievodca po @ConfigurationProperties v Spring Boot

1. Úvod

Spring Boot má mnoho užitočných funkcií vrátane externalizovaná konfigurácia a ľahký prístup k vlastnostiam definovaným v súboroch vlastností. Predchádzajúci tutoriál popisoval rôzne spôsoby, ako to možno urobiť.

Teraz ideme preskúmať @ConfigurationProperties anotácia podrobnejšie.

2. Inštalácia

Tento výukový program používa pomerne štandardné nastavenie. Začíname pridaním pružina-štartér-štartér-rodič ako rodič v našom pom.xml:

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

Aby sme mohli overiť vlastnosti definované v súbore, potrebujeme tiež implementáciu JSR-303 a hibernácia-validátor je jedným z nich.

Pridajme to k nášmu pom.xml tiež:

 org.hibernate hibernate-validator 6.0.16.Final 

Stránka „Začíname s programom Hibernate Validator“ obsahuje ďalšie podrobnosti.

3. Jednoduché vlastnosti

Oficiálna dokumentácia odporúča, aby sme vlastnosti konfigurácie izolovali do samostatných POJO.

Začnime tým teda:

@Configuration @ConfigurationProperties (prefix = "mail") verejná trieda ConfigProperties {private String hostName; súkromný int port; súkromný reťazec z; // štandardné getre a setre}

Používame @ Konfigurácia aby Spring vytvoril Spring bean v kontexte aplikácie.

@ConfigurationProperties najlepšie funguje s hierarchickými vlastnosťami, ktoré majú všetky rovnakú predponu; preto pridávame predponu poštou.

Rámec Spring používa štandardné nastavovače fazule Java, takže musíme deklarovať nastavovače pre každú z vlastností.

Poznámka: Ak nepoužívame @ Konfigurácia v POJO, potom musíme pridať @EnableConfigurationProperties (ConfigProperties.class) v hlavnej triede aplikácií Spring na naviazanie vlastností na POJO:

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

To je všetko! Jar automaticky naviaže každú vlastnosť definovanú v našom súbore vlastností, ktorá má predponu poštou a rovnaké meno ako jedno z polí v ConfigProperties trieda.

Jar používa niektoré uvoľnené pravidlá pre väzobné vlastnosti. Výsledkom je, že všetky nasledujúce variácie sú viazané na vlastníctvo meno hosťa:

mail.hostName mail.hostname mail.hostitel_name mail.hostitelske meno mail.HOST_NAME 

Preto môžeme na nastavenie všetkých polí použiť nasledujúci súbor vlastností:

#Jednoduché vlastnosti [chránené e-mailom] mail.port = 9000 [chránené e-mailom] 

3.1. Jarná topánka 2.2

Od Spring Boot 2.2 Spring vyhľadáva a registruje sa @ConfigurationProperties triedy prostredníctvom skenovania triedy. Preto nie je potrebné tieto triedy anotovať @ Komponent (a ďalšie meta-anotácie ako @Configuration),alebo dokonca použiť @EnableConfigurationProperties:

@ConfigurationProperties (prefix = "mail") verejná trieda ConfigProperties {private String hostName; súkromný int port; súkromný reťazec z; // štandardné getre a setre} 

Skener cesty k triede povolil @SpringBootApplication nájde ConfigProperties triedy, aj keď sme túto triedu anotovali @ Komponent.

Okrem toho môžeme použiť the @ConfigurationPropertiesScan anotácia na skenovanie vlastných umiestnení pre triedy vlastností konfigurácie:

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

Týmto spôsobom bude Spring hľadať triedy vlastností konfigurácie iba v com.baeldung.properties balíček.

4. Vnorené vlastnosti

Môžeme mať vnorené vlastnosti v Zoznamy, mapy, a Triedy.

Poďme vytvoriť nový Poverovacie listiny trieda, ktorá sa má použiť pre niektoré vnorené vlastnosti:

verejné poverenia triedy {private String authMethod; súkromné ​​reťazcové používateľské meno; súkromné ​​reťazcové heslo; // štandardné getre a setre}

Musíme tiež aktualizovať ConfigProperties trieda používať a Zoznam, a Mapaa Poverovacie listiny trieda:

public class ConfigProperties {private String host; súkromný int port; súkromný reťazec z; súkromný zoznam defaultRecipients; súkromná mapa additionalHeaders; osobné poverenia; // štandardné getre a setre}

Nasledujúci súbor vlastností nastaví všetky polia:

#Jednoduché vlastnosti [chránené e-mailom] mail.port = 9000 [chránené e-mailom] # Zoznam vlastností mail.defaultRecipients [0] [chránené e-mailom] mail.defaultRecipients [1] [chránené e-mailom] #Map Properties mail.additionalHeaders.redelivery = skutočná pošta .additionalHeaders.secure = true #Object vlastnosti mail.credentials.username = john mail.credentials.password = heslo mail.credentials.authMethod = SHA1

5. Používanie @ConfigurationProperties na a @Bean Metóda

Môžeme tiež použiť @ConfigurationProperties anotácia dňa @Bean- anotované metódy.

Tento prístup môže byť obzvlášť užitočný, keď chceme viazať vlastnosti na komponent tretej strany, ktorý je mimo našu kontrolu.

Vytvorme jednoduchý Položka triedy, ktorú použijeme v nasledujúcom príklade:

public class Item {private String name; veľkosť súkromného int; // štandardné getre a setre}

Teraz sa pozrime, ako môžeme použiť @ConfigurationProperties na a @Bean metóda viazania externalizovaných vlastností na Položka inštancia:

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

Následne bude akákoľvek vlastnosť s predponou položky namapovaná na Položka inštancia riadená jarným kontextom.

6. Validácia majetku

@ConfigurationProperties poskytuje overenie vlastností pomocou formátu JSR-303. To umožňuje najrôznejšie elegantné veci.

Urobme napríklad meno hosťa majetok povinný:

@NotBlank private String hostName;

Ďalej urobíme authMethod vlastnosť s dĺžkou od 1 do 4 znakov:

@ Dĺžka (max = 4, min = 1) súkromný reťazec authMethod;

Potom prístav nehnuteľnosť od 1025 do 65536:

@Min (1025) @Max (65536) súkromný int port; 

Nakoniec od vlastnosť sa musí zhodovať s formátom e-mailovej adresy:

@Pattern (regexp = "^ [a-z0-9 ._% + -] [chránené e-mailom] [a-z0-9 .-] + \. [Az] {2,6} $") súkromný reťazec z ; 

To nám pomáha veľa znížiť ako - inak podmienok v našom kódexe, vďaka čomu vyzerá oveľa čistejšie a stručnejšie.

Ak niektorá z týchto validácií zlyhá, potom by hlavná aplikácia nezačala s IllegalStateException.

Rámec validácie Hibernate používa štandardné getre a settery Java bean, takže je dôležité, aby sme deklarovali getre a settery pre každú z vlastností.

7. Prevod majetku

@ConfigurationProperties podporuje prevod pre viac druhov viazania vlastností na ich zodpovedajúce fazule.

7.1. Trvanie

Začneme tým, že sa pozrieme na prevod vlastností na Trvanie predmety.

Tu máme dve polia typu Trvanie:

@ConfigurationProperties (prefix = "prevod") verejná trieda PropertyConversion {súkromné ​​trvanie timeInDefaultUnit; súkromná doba trvaniaInNano; ...}

Toto je náš súbor vlastností:

conversion.timeInDefaultUnit = 10 conversion.timeInNano = 9ns

Vo výsledku pole timeInDefaultUnit bude mať hodnotu 10 milisekúnd a timeInNano bude mať hodnotu 9 nanosekúnd.

Podporované jednotky sú ns, us, ms, s, m, h a d pre nanosekundy, mikrosekundy, milisekundy, sekundy, minúty, hodiny a dni.

Predvolená jednotka je milisekundy, čo znamená, že pokiaľ neurčíte jednotku vedľa číselnej hodnoty, Spring prevedie hodnotu na milisekundy.

Tiež môžeme prepísať predvolenú jednotku pomocou @DurationUnit:

@DurationUnit (ChronoUnit.DAYS) súkromné ​​trvanie timeInDays;

Toto je zodpovedajúca vlastnosť:

conversion.timeInDays = 2

7.2. DataSize

Podobne Spring Boot @ConfigurationProperties podporuje DataSize prevod typu.

Pridajme tri polia typu DataSize:

private DataSize sizeInDefaultUnit; private DataSize sizeInGB; @DataSizeUnit (DataUnit.TERABYTES) súkromná DataSize sizeInTB;

Toto sú zodpovedajúce vlastnosti:

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

V takom prípade sizeInDefaultUnit hodnota bude 300 bajtov, pretože predvolenou jednotkou sú bajty.

Podporované jednotky sú B, KB, MB, GBa TB. Tiež môžeme prepísať predvolenú jednotku pomocou @DataSizeUnit.

7.3. Vlastné Prevádzač

Môžeme pridať aj svoj vlastný zvyk Prevádzač na podporu konverzie vlastnosti na konkrétny typ triedy.

Pridajme jednoduchú triedu Zamestnanec:

public class Employee {private String name; dvojitý súkromný plat; }

Potom vytvoríme vlastný prevodník na prevod tejto vlastnosti:

conversion.employee = john, 2000

Prevedieme to na súbor typu Zamestnanec:

súkromný zamestnanec;

Budeme musieť implementovať Prevádzač rozhranie použitie @ConfigurationPropertiesBinding anotáciu na registráciu nášho zvyku Prevádzač:

@Component @ConfigurationPropertiesBinding verejná trieda EmployeeConverter implementuje Converter {@Override public Employee convert (String from) {String [] data = from.split (","); vrátiť nového zamestnanca (data [0], Double.parseDouble (data [1])); }}

8. Nezmeniteľné @ConfigurationProperties Viazanie

Od jarného zavedenia 2.2, môžeme použiť @ConstructorBinding anotácia na naviazanie našich konfiguračných vlastností.

To to v podstate znamená @ConfigurationProperties-anotované triedy môžu byť teraz nemenné.

@ConfigurationProperties (prefix = "mail.credentials") @ConstructorBinding verejná trieda ImmutableCredentials {private final String authMethod; súkromné ​​konečné užívateľské meno reťazca; súkromné ​​konečné reťazcové heslo; public ImmutableCredentials (reťazec authMethod, meno používateľa reťazca, heslo reťazca) {this.authMethod = authMethod; this.username = username; this.password = heslo; } public String getAuthMethod () {return authMethod; } public String getUsername () {vrátiť používateľské meno; } public String getPassword () {návratové heslo; }}

Ako vidíme, pri použití @ConstructorBinding, musíme poskytnúť konštruktoru všetky parametre, ktoré by sme chceli zviazať.

Všimnite si, že všetky polia v ImmutableCredentials sú konečné. Taktiež neexistujú žiadne metódy nastavenia.

Ďalej je dôležité to zdôrazniť Ak chcete použiť väzbu konštruktora, musíme výslovne povoliť našu konfiguračnú triedu buď pomocou @EnableConfigurationProperties alebo s @ConfigurationPropertiesScan .

9. Záver

V tomto článku sme preskúmali @ConfigurationProperties anotáciu a zvýraznil niektoré užitočné funkcie, ktoré poskytuje, napríklad uvoľnené viazanie a overenie fazule.

Ako obvykle je kód k dispozícii na stránkach Github.


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