Ú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.