Útmutató a @ConfigurationProperties in Spring Boot alkalmazáshoz

1. Bemutatkozás

A Spring Boot számos hasznos funkcióval rendelkezik, többek között külső konfiguráció és könnyű hozzáférés a tulajdonságfájlokban meghatározott tulajdonságokhoz. Egy korábbi bemutató különféle módokat írt le erre.

Most felfedezzük a @ConfigurationProperties annotáció részletesebben.

2. Beállítás

Ez az oktatóanyag meglehetősen szokásos beállítást használ. Kezdjük hozzáadással tavasz-bakancs-induló-szülő mint a szülő a mi pom.xml:

 org.springframework.boot spring-boot-starter-parent 2.2.2.KÖZLEMÉNY 

A fájlban definiált tulajdonságok érvényesítéséhez szükségünk van a JSR-303 és hibernate-validator az egyik.

Tegyük hozzá a sajátunkhoz pom.xml is:

 org.hibernate hibernate-validator 6.0.16.Final 

A „Hibernate Validator használatának megkezdése” oldalon további részletek találhatók.

3. Egyszerű tulajdonságok

A hivatalos dokumentáció azt tanácsolja, hogy a konfigurációs tulajdonságokat külön POJO-kba különítsük el.

Tehát kezdjük azzal, hogy:

@Configuration @ConfigurationProperties (prefix = "mail") public class ConfigProperties {private String hostName; privát int kikötő; privát húr; // szabványos mérőeszközök és beállítók}

Használunk @ Konfiguráció hogy a Spring tavaszi babot hozzon létre az alkalmazás kontextusában.

@ConfigurationProperties a legjobban olyan hierarchikus tulajdonságokkal működik, amelyek mindegyikének ugyanaz az előtagja; ezért hozzáadjuk a levél.

A Spring keretrendszer szabványos Java-bab-beállítókat használ, ezért minden tulajdonsághoz beállítókat kell deklarálnunk.

Megjegyzés: Ha nem használjuk @ Konfiguráció a POJO-ban, akkor hozzá kell tennünk @EnableConfigurationProperties (ConfigProperties.class) a fő tavaszi alkalmazásosztályban, hogy a tulajdonságokat a POJO-hoz kösse:

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

Ez az! A Spring automatikusan összeköti a tulajdonságfájlunkban definiált összes olyan tulajdonságot, amelynek előtagja van levél és ugyanaz a név, mint a ConfigProperties osztály.

A tavasz néhány laza szabályt alkalmaz a kötési tulajdonságokra. Ennek eredményeként a következő variációk mind az ingatlanhoz vannak kötve hostName:

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

Ezért az összes mező beállításához a következő tulajdonságfájlt használhatjuk:

#Egyszerű tulajdonságok [e-mail védett] mail.port = 9000 [e-mail védett] 

3.1. Tavaszi bakancs 2.2

A Spring Boot 2.2-től a Spring megtalálja és regisztrálja @ConfigurationProperties osztályok osztálypálya letapogatással. Ebből kifolyólag, az ilyen osztályokat nem kell jelölni @Összetevő (és egyéb meta-annotációk, például @Configuration),vagy akár a @EnableConfigurationProperties:

@ConfigurationProperties (prefix = "mail") public class ConfigProperties {private String hostName; privát int kikötő; privát húr; // szabványos mérőeszközök és beállítók} 

Az osztályút szkennert engedélyezte @SpringBootApplication megtalálja a ConfigProperties osztály, annak ellenére, hogy nem jegyeztük fel ezt az osztályt @Összetevő.

Ezen felül használhatjuk a @ConfigurationPropertiesScan kommentár az egyéni helyek beolvasásához a konfigurációs tulajdonságosztályokhoz:

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

Így a Spring csak a konfigurációs tulajdonság osztályokat keresi com.baeldung.properties csomag.

4. Beágyazott tulajdonságok

Beágyazott tulajdonságai lehetnek Listák, Térképek, és Osztályok.

Hozzunk létre egy újat Hitelesítő adatok osztály beágyazott tulajdonságokhoz:

public class Hitelesítő adatok {private String authMethod; privát String felhasználónév; privát karakterlánc jelszó; // szabványos mérőeszközök és beállítók}

Frissítenünk kell a ConfigProperties osztály használni a Lista, a Térkép, és a Hitelesítő adatok osztály:

public class ConfigProperties {private String host; privát int kikötő; privát húr; private List defaultRecipients; privát Térkép továbbiHeaders; magán hitelesítő adatok; // szabványos mérőeszközök és beállítók}

A következő tulajdonságfájl állítja be az összes mezőt:

#Egyszerű tulajdonságok [e-mail védett] mail.port = 9000 [e-mail védett] # Lista tulajdonságok mail.defaultRecipients [0] [e-mail védett] mail.defaultRecipients [1] [e-mail védett] # Térkép tulajdonságai mail.additionalHeaders.redelivery = igaz levél .additionalHeaders.secure = true # Objektum tulajdonságai mail.credentials.username = János mail.credentials.password = Jelszó mail.credentials.authMethod = SHA1

5. Használata @ConfigurationProperties rajta @Bab Módszer

Használhatjuk a @ConfigurationProperties felirat bekapcsolva @Bab-jegyzetlen módszerek.

Ez a megközelítés különösen hasznos lehet, ha a tulajdonságokat egy harmadik féltől származó komponenshez akarjuk kötni, amelyre mi nem tartozik.

Hozzunk létre egy egyszerű Tétel osztály, amelyet a következő példában fogunk használni:

public class Item {private String name; privát int méret; // szabványos mérőeszközök és beállítók}

Most nézzük meg, hogyan tudjuk használni @ConfigurationProperties rajta @Bab módszer a külső tulajdonságok összekapcsolására a Tétel példa:

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

Következésképpen minden elem előtagú tulajdonság hozzá lesz rendelve a Tétel a tavaszi kontextus által kezelt példány.

6. Tulajdon érvényesítése

@ConfigurationProperties biztosítja a tulajdonságok validálását a JSR-303 formátum használatával. Ez mindenféle ügyes dolgot lehetővé tesz.

Például készítsük el a hostName ingatlan kötelező:

@NotBlank privát karakterlánc hostName;

Ezután készítsük el a authMethod tulajdonság 1 és 4 karakter között:

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

Aztán a kikötő ingatlan 1025-től 65536-ig:

@Min (1025) @Max (65536) privát int port; 

Végül a tól től a tulajdonságnak meg kell egyeznie az e-mail cím formátumával:

@Minta (regexp = "^ [a-z0-9 ._% + -] [e-mail védett] [a-z0-9 .-] + \. [Az] {2,6} $") privát karakterlánc ; 

Ez segít nekünk sokat csökkenteni ha más feltételeket, és sokkal tisztábbá és tömörebbé teszi.

Ha ezen ellenőrzések bármelyike ​​meghiúsul, akkor a fő alkalmazás nem indulna el egy IllegalStateException.

A Hibernate Validation keretrendszer szabványos Java babgettereket és beállítókat használ, ezért fontos, hogy minden tulajdonsághoz deklaráljuk a gettert és a beállítót.

7. Tulajdon-átalakítás

@ConfigurationProperties támogatja a konverziót a tulajdonságok megkötéséhez a megfelelő babokhoz.

7.1. Időtartam

Kezdjük azzal, hogy megvizsgáljuk a tulajdonságok konvertálását Időtartam tárgyakat.

Itt két típusú mezőnk van Időtartam:

@ConfigurationProperties (prefix = "conversion") public class PropertyConversion {private Duration timeInDefaultUnit; privát Időtartam idejeInNano; ...}

Ez a tulajdonságfájlunk:

conversion.timeInDefaultUnit = 10 conversion.timeInNano = 9ns

Ennek eredményeként a mező timeInDefaultUnit értéke 10 milliszekundum lesz, és timeInNano értéke 9 nanoszekundum lesz.

A támogatott egységek ns, us, ms, s, m, h és d nanoszekundumokra, mikroszekundumokra, milliszekundumokra, másodpercekre, percekre, órákra és napokra.

Az alapértelmezett egység milliszekundum, ami azt jelenti, hogy ha nem adunk meg egységet a numerikus érték mellett, a Spring ezredmásodpercekké konvertálja az értéket.

Az alapértelmezett egységet a @DurationUnit:

@DurationUnit (ChronoUnit.DAYS) privát Időtartam timeInDays;

Ez a megfelelő tulajdonság:

conversion.timeInDays = 2

7.2. DataSize

Hasonlóképpen a tavaszi bakancs @ConfigurationProperties támogatja DataSize típusátalakítás.

Adjunk hozzá három típusú mezőt DataSize:

privát DataSize sizeInDefaultUnit; privát DataSize sizeInGB; @DataSizeUnit (DataUnit.TERABYTES) privát DataSize sizeInTB;

Ezek a megfelelő tulajdonságok:

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

Ebben az esetben a sizeInDefaultUnit értéke 300 bájt lesz, mivel az alapértelmezett egység a bájt.

A támogatott egységek B, KB, MB, GB, és TUBERKULÓZIS. Az alapértelmezett egységet a @DataSizeUnit.

7.3. Egyedi Átalakító

Hozzáadhatjuk saját szokásunkat is Átalakító a tulajdonság átalakítása egy meghatározott osztálytípussá.

Adjunk hozzá egy egyszerű osztályt Munkavállaló:

public class Alkalmazott {private String név; magán kettős fizetés; }

Ezután létrehozunk egy egyéni átalakítót a tulajdonság átalakításához:

konverzió.alkalmazott = john, 2000

Átalakítjuk egy típusú fájllá Munkavállaló:

magán alkalmazott alkalmazott;

Meg kell valósítanunk a Átalakító interfész, akkor használat @ConfigurationPropertiesBinding kommentár a szokásunk regisztrálásához Átalakító:

@Component @ConfigurationPropertiesBinding public class EmployeeConverter implementálja a Converter {@Orride public Employee convert (String from) {String [] data = from.split (","); return new Employee (adatok [0], Double.parseDouble (adatok [1])); }}

8. Megváltozhatatlan @ConfigurationProperties Kötés

A Spring Boot 2.2-től, használhatjuk a @ConstructorBinding jelölés a konfigurációs tulajdonságok megkötésére.

Ez lényegében azt jelenti @ConfigurationProperties-jegyzetlen osztályok immár megváltoztathatatlanok.

@ConfigurationProperties (prefix = "mail.credentials") @ConstructorBinding public class ImmutableCredentials {private final String authMethod; private final String felhasználónév; private final String jelszó; public ImmutableCredentials (String authMethod, String felhasználónév, String jelszó) {this.authMethod = authMethod; this.username = felhasználónév; ez.jelszó = jelszó; } public String getAuthMethod () {return authMethod; } public String getUsername () {return felhasználónév; } public String getPassword () {return jelszó; }}

Mint láthatjuk, használatakor @ConstructorBinding, meg kell adnunk a konstruktornak az összes paramétert, amelyet kötni szeretnénk.

Vegye figyelembe, hogy a ImmutableCredentials véglegesek. Nincsenek szetter módszerek sem.

Továbbá fontos ezt hangsúlyozni A konstruktor kötés használatához kifejezetten engedélyeznünk kell a konfigurációs osztályunkat akár a @EnableConfigurationProperties vagy a @ConfigurationPropertiesScan segítségével .

9. Következtetés

Ebben a cikkben feltártuk a @ConfigurationProperties feliratozással és kiemelte az általa nyújtott hasznos funkciókat, például a könnyebb kötést és a babellenőrzést.

Szokás szerint a kód elérhető a Githubon.