Tulajdonságok tavasszal és tavasszal

1. Áttekintés

Ez az oktatóanyag megmutatja hogyan lehet a tulajdonságokat tavasszal beállítani és használni Java konfiguráción keresztül és @PropertySource.

Azt is megnézzük, hogyan működnek a tulajdonságok a Spring Boot-ban.

2. Regisztráljon egy tulajdonságfájlt kommentárokkal

A 3.1 tavasz szintén bemutatja az új @PropertySource annotáció mint kényelmes mechanizmus az ingatlanforrások hozzáadásához a környezethez.

Használhatjuk ezt az annotációt a @ Konfiguráció kommentár:

@Configuration @PropertySource ("classpath: foo.properties") public class PropertiesWithJavaConfig {// ...}

Az új tulajdonságfájl regisztrálásának másik nagyon hasznos módja a helyőrző használata, amely lehetővé teszi számunkra dinamikusan válassza ki a megfelelő fájlt futás közben:

@PropertySource ({"classpath: persistence - $ {envTarget: mysql} .properties"}) ...

2.1. Több tulajdon helyének meghatározása

A @PropertySource az annotáció megismételhető a Java 8 konvenciói szerint. Ezért, ha Java 8-at vagy újabbat használunk, akkor ezt a jegyzetet használhatjuk több tulajdonság helyének meghatározására:

@PropertySource ("classpath: foo.properties") @PropertySource ("classpath: bar.properties") public class PropertiesWithJavaConfig {// ...}

Természetesen, használhatjuk a @PropertySources jelölést és adjon meg egy tömböt @PropertySource. Ez minden támogatott Java verzióban működik, nem csak Java 8 vagy újabb verzióban:

@PropertySources ({@PropertySource ("classpath: foo.properties"), @PropertySource ("classpath: bar.properties")}) nyilvános osztály PropertiesWithJavaConfig {// ...}

Mindkét esetben érdemes megjegyezni, hogy egy tulajdonnév ütközése esetén az utolsó olvasott forrás élvez elsőbbséget.

3. A Tulajdonságok használata / beadása

Tulajdonság beadása a @Érték annotáció magától érthetődő:

@Value ("$ {jdbc.url}") privát karakterlánc jdbcUrl;

Megadhatunk egy alapértelmezett értéket is a tulajdonsághoz:

@Value ("$ {jdbc.url: aDefaultUrl}") privát karakterlánc jdbcUrl;

Az új PropertySourcesPlaceholderConfigurer hozzáadva a 3.1 tavasszal oldja meg a $ {…} helyőrzőket a babdefiníció tulajdonságértékein belül és @Érték annotációk.

Végül megtehetjük a tulajdonság használatával megkapja az ingatlan értékét Környezet API:

@Autowired privát környezet env; ... dataSource.setUrl (env.getProperty ("jdbc.url"));

4. Tulajdonságok tavaszi csomagtartóval

Mielőtt a tulajdonságok fejlettebb konfigurációs lehetőségeivel foglalkoznánk, töltsünk el egy kis időt a Spring Boot új tulajdonságainak támogatásával.

Általában véve, ez az új támogatás kevesebb konfigurációt igényel a szokásos tavaszhoz képest, ami természetesen a Boot egyik fő célja.

4.1. application.properties: az Alapértelmezett tulajdonságfájl

A rendszerindítás a tulajdonságfájlokra alkalmazza a konfiguráció feletti megközelítést. Ez azt jelenti egyszerűen tehetünk egy alkalmazás.tulajdonságok fájl a mi src / main / resources könyvtárat, és automatikusan felismeri. Ezután bármilyen terhelt tulajdonságot beleadhatunk belőle a szokásos módon.

Tehát ennek az alapértelmezett fájlnak a használatával nem kell kifejezetten regisztrálnunk a PropertySource vagy akár egy tulajdonságfájl elérési útját is megadja.

Futás közben konfigurálhatunk egy másik fájlt is, ha szükséges, egy környezeti tulajdonság használatával:

java -jar app.jar --spring.config.location = classpath: /another-location.properties

A Spring Boot 2.3-tól helyettesítő karaktereket is megadhatunk a konfigurációs fájlokhoz.

Beállíthatjuk például a tavasz.konfig.hely tulajdonhoz config / * /:

java -jar app.jar --spring.config.location = config / * /

Így a Spring Boot megkeresi a config / * / könyvtárminta a jar fájlunkon kívül. Ez jól jön, ha a konfigurációs tulajdonságoknak több forrása is van.

A verzió óta 2.4.0, A Spring Boot támogatja a több dokumentum tulajdonságfájljainak használatát, hasonlóan a YAML-hez, mint a tervezés:

baeldung.customProperty = defaultValue # --- baeldung.customProperty = overriddenValue

Ne feledje, hogy a tulajdonságfájlok esetében a háromjeles jelölést egy megjegyzés karakter (#).

4.2. Környezetspecifikus tulajdonságok fájl

Ha különféle környezeteket kell megcéloznunk, akkor a Boot-ban erre van egy beépített mechanizmus.

Egyszerűen definiálhatunk egy alkalmazás- környezet.tulajdonságok fájl a src / main / resources könyvtárat, majd állítson be egy Spring profilt ugyanazzal a környezeti névvel.

Például, ha definiálunk egy „staging” környezetet, ez azt jelenti, hogy meg kell határoznunk a színpadra állítás profil majd alkalmazás- állomás.tulajdonságok.

Ez az env fájl betöltődik és elsőbbséget élvez az alapértelmezett tulajdonságfájllal szemben. Ne feledje, hogy az alapértelmezett fájl továbbra is betöltődik, csak ha tulajdonságütközés történik, akkor a környezettel kapcsolatos tulajdonságfájl élvez elsőbbséget.

4.3. Teszt-specifikus tulajdonságok fájl

Előfordulhat, hogy különböző tulajdonságértékek használatára is szükségünk van, amikor alkalmazásunk tesztelés alatt áll.

A Spring Boot ezt a számunkra úgy kezeli, hogy belenéz a sajátunkba src / test / resources könyvtárat egy tesztfuttatás során. Ismét az alapértelmezett tulajdonságok továbbra is injektálhatók a szokásos módon, de ütközés esetén ezek felülírják.

4.4. A @TestPropertySource Megjegyzés

Ha részletesebb ellenőrzésre van szükségünk a teszt tulajdonságai felett, akkor használhatjuk a @TestPropertySource annotáció.

Ez lehetővé teszi számunkra a teszt tulajdonságainak beállítását egy adott tesztkörnyezet számára, elsőbbséget élvezve az alapértelmezett tulajdonságforrásokkal szemben:

@RunWith (SpringRunner.class) @TestPropertySource ("/ foo.properties") public class FilePropertyInjectionUnitTest {@Value ("$ {foo}") private String foo; @Test public void whenFilePropertyProvided_thenProperlyInjected () {assertThat (foo) .isEqualTo ("bar"); }}

Ha nem akarunk fájlt használni, akkor közvetlenül megadhatunk neveket és értékeket:

@RunWith (SpringRunner.class) @TestPropertySource (properties = {"foo = bar"}) public class PropertyInjectionUnitTest {@Value ("$ {foo}") private String foo; @Test public void whenPropertyProvided_thenProperlyInjected () {assertThat (foo) .isEqualTo ("bar"); }}

Hasonló hatást is elérhetünk a tulajdonságait érvelése @SpringBootTest kommentár:

@RunWith (SpringRunner.class) @SpringBootTest (tulajdonságok = {"foo = bar"}, class = SpringBootPropertiesTestApplication.class) nyilvános osztály SpringBootPropertyInjectionIntegrationTest {@Value ("$ {foo}") privát karakterlánc foo; @Test public void whenSpringBootPropertyProvided_thenProperlyInjected () {assertThat (foo) .isEqualTo ("bar"); }}

4.5. Hierarchikus tulajdonságok

Ha vannak tulajdonságaik, amelyek csoportosítva vannak, akkor felhasználhatjuk a @ConfigurationProperties annotáció, amely ezeket a tulajdonság hierarchiákat Java objektumdiagramokba térképezi fel.

Vegyünk néhány tulajdonságot, amelyeket az adatbázis-kapcsolat konfigurálásához használunk:

database.url = jdbc: postgresql: / localhost: 5432 / instance database.username = foo database.password = bar

Ezután használjuk a kommentárokat egy adatbázis objektumhoz:

@ConfigurationProperties (prefix = "adatbázis") public class Database {String url; String felhasználónév; Karakterlánc jelszó; // szabványos mérőeszközök és beállítók}

A Spring Boot újra alkalmazza a konvenciókonfigurációs megközelítést, automatikusan leképezi a tulajdonságneveket és a megfelelő mezőket. Minden, amit meg kell adnunk, az ingatlan előtag.

Ha mélyebbre akarja ásni a konfigurációs tulajdonságokat, tekintse meg részletes cikkünket.

4.6. Alternatíva: YAML fájlok

A Spring a YAML fájlokat is támogatja.

Ugyanazok az elnevezési szabályok vonatkoznak a tesztspecifikus, a környezeti és az alapértelmezett tulajdonságfájlokra. Az egyetlen különbség a fájlkiterjesztés és annak függése, hogy a SnakeYAML könyvtár milyen osztályúton van.

A YAML különösen jó hierarchikus tulajdonságtárolásra; a következő tulajdonságfájl:

database.url = jdbc: postgresql: / localhost: 5432 / instance database.username = foo database.password = sáv titka: foo

szinonimája a következő YAML fájlnak:

adatbázis: url: jdbc: postgresql: / localhost: 5432 / instance felhasználónév: foo jelszó: bar secret: foo

Érdemes megemlíteni azt is, hogy a YAML fájlok nem támogatják a @PropertySource kommentár, tehát ha ezt a feliratot kell használnunk, akkor az egy tulajdonságfájl használatára kényszerít minket.

Egy másik figyelemre méltó tény, hogy a 2.4.0 verzióban a Spring Boot megváltoztatta a tulajdonságok betöltésének módját a több dokumentumot tartalmazó YAML fájlokból. Korábban a hozzáadásuk sorrendje a profil aktiválási sorrendjén alapult. Az új verzióval azonban a keretrendszer ugyanazokat a sorrendszabályokat követi, amelyeket korábban jeleztünk .tulajdonságok fájlok; a fájlban alacsonyabban deklarált tulajdonságok egyszerűen felülírják a magasabbakat.

Ezenkívül ebben a verzióban a profilok már nem aktiválhatók a profil-specifikus dokumentumokból, így az eredmény világosabb és kiszámíthatóbb.

4.7. További konfigurációs fájlok importálása

A 2.4.0 verzió előtt a Spring Boot engedélyezte további konfigurációs fájlok beépítését a tavasz.konfig.hely és spring.config.additional-location tulajdonságokkal, de voltak bizonyos korlátai. Például meg kellett határozni őket az alkalmazás elindítása előtt (környezeti vagy rendszertulajdonságokként, vagy parancssori argumentumok használatával), mivel a folyamat elején használták őket.

Az említett változatban használhatjuk a tavasz.konfig.import ingatlanon belül alkalmazás.tulajdonságok vagy alkalmazás.yml fájl, hogy további fájlokat könnyedén tartalmazzon. Ez a szálláshely néhány érdekes funkciót támogat:

  • több fájl vagy könyvtár hozzáadása
  • a fájlok az osztályútvonalról vagy egy külső könyvtárból tölthetők be
  • jelzi, hogy az indítási folyamat kudarcot vall, ha egy fájl nem található, vagy opcionális fájl
  • kiterjesztés nélküli fájlok importálása

Lássunk egy érvényes példát:

spring.config.import = classpath: additional-application.properties, classpath: additional-application [.yml], opcionális: file: ./ external.properties, classpath: additional-application-properties /

Megjegyzés: itt csak az érthetőség kedvéért formáztuk ezt a tulajdonságot sortörésekkel.

A tavasz az importot új dokumentumként kezeli, amelyet közvetlenül a behozatali nyilatkozat alá helyeznek be.

4.8. Tulajdonságok a parancssori argumentumokból

A fájlok használata mellett a tulajdonságokat közvetlenül a parancssorba is átadhatjuk:

java -jar app.jar --property = "value"

Megtehetjük ezt a rendszer tulajdonságain keresztül is, amelyek a -befőttes üveg parancsot, nem pedig utána:

java -Dproperty.name = "value" -jar app.jar

4.9. Tulajdonságok a környezeti változóktól

A Spring Boot a környezeti változókat is felismeri, tulajdonságként kezelve:

export név = érték java -jar app.jar 

4.10. A vagyoni értékek véletlenszerűsítése

Ha nem akarunk determinista tulajdonságértékeket, használhatjuk RandomValuePropertySource a tulajdonságok értékeinek randomizálása:

random.number = $ {random.int} random.long = $ {random.long} random.uuid = $ {random.uuid}

4.11. Az ingatlanforrások további típusai

A Spring Boot az ingatlanforrások sokaságát támogatja, és átgondolt megrendelést hajt végre az ésszerű felülírás érdekében. Érdemes megismerni a hivatalos dokumentációt, amely túlmutat e cikk terjedelmén.

5. Konfigurálás nyers bab felhasználásával - a PropertySourcesPlaceholderConfigurer

A tulajdonságok Springbe történő bevitelének kényelmes módszerei mellett manuálisan is meghatározhatjuk és újra megadhatjuk a tulajdonságkonfigurációs komponenst.

A PropertySourcesPlaceholderConfigurer teljes kontrollt ad nekünk a konfiguráció felett, azzal a hátránnyal, hogy bőbeszédűbbek vagyunk és legtöbbször feleslegesek vagyunk.

Nézzük meg, hogyan definiálhatjuk ezt a babot a Java konfigurációval:

@Bean public static PropertySourcesPlaceholderConfigurer tulajdonságok () {PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer (); Erőforrás [] erőforrások = új ClassPathResource [] {új ClassPathResource ("foo.properties")}; pspc.setLocations (források); pspc.setIgnoreUnresolvablePlaceholder (true); return pspc; }

6. Tulajdonságok a szülő-gyermek összefüggésekben

Ez a kérdés újra és újra felmerül: Mi történik, ha a mi a webalkalmazásnak van szülő és gyermek kontextusa? A szülői környezetnek lehet néhány közös alapfunkciója és babja, majd egy (vagy több) gyermekkörnyezet, amely esetleg tartalmaz Servlet-specifikus babot.

Ebben az esetben hogyan lehet a legjobban meghatározni a tulajdonságfájlokat és beilleszteni ezeket az összefüggéseket? És hogyan lehet a legjobban kinyerni ezeket a tulajdonságokat tavasszal?

Egyszerű bontást adunk.

Ha a fájl a szülői környezetben definiálva:

  • @Érték ben működik Gyermek kontextus: IGEN
  • @Érték ben működik Szülői kontextus: IGEN
  • környezet.getProperty ban ben Gyermek kontextus: IGEN
  • környezet.getProperty ban ben Szülői kontextus: IGEN

Ha a fájl a gyermek összefüggésében definiálva:

  • @Érték ben működik Gyermek kontextus: IGEN
  • @Érték ben működik Szülői kontextus: NEM
  • környezet.getProperty ban ben Gyermek kontextus: IGEN
  • környezet.getProperty ban ben Szülői kontextus: NEM

7. Következtetés

Ez a cikk több példát mutatott be a tulajdonságokkal és tulajdonságfájlokkal tavasszal történő munkára.

Mint mindig, a cikket támogató teljes kód elérhető a GitHubon.