Vlastnosti s pružinou a pružinou

1. Prehľad

Tento tutoriál sa ukáže ako nastaviť a používať vlastnosti na jar prostredníctvom konfigurácie Java a @PropertySource.

Uvidíme tiež, ako vlastnosti fungujú v Spring Boot.

2. Registrujte súbor vlastností pomocou anotácií

Jar 3.1 tiež predstavuje nové @PropertySource anotácia ako vhodný mechanizmus na pridávanie zdrojov nehnuteľností do životného prostredia.

Túto anotáciu môžeme použiť v spojení s @ Konfigurácia anotácia:

@Configuration @PropertySource ("classpath: foo.properties") verejná trieda PropertiesWithJavaConfig {// ...}

Ďalším veľmi užitočným spôsobom registrácie nového súboru vlastností je použitie zástupného symbolu, ktorý nám to umožňuje dynamicky vyberať správny súbor za behu:

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

2.1. Definovanie viacerých umiestnení nehnuteľností

The @PropertySource anotácia je opakovateľná podľa konvencií Java 8. Ak teda používame Java 8 alebo novšiu, môžeme pomocou tejto anotácie definovať viac umiestnení vlastnosti:

@PropertySource ("classpath: foo.properties") @PropertySource ("classpath: bar.properties") verejná trieda PropertiesWithJavaConfig {// ...}

Samozrejme, môžeme tiež použiť @PropertySources anotáciu a zadajte pole @PropertySource. Funguje to v akejkoľvek podporovanej verzii Java, nielen v Java 8 alebo vyššej:

@PropertySources ({@PropertySource ("classpath: foo.properties"), @PropertySource ("classpath: bar.properties")})) verejná trieda PropertiesWithJavaConfig {// ...}

V obidvoch prípadoch stojí za zmienku, že v prípade kolízie názvu vlastnosti má prednosť posledné načítanie zdroja.

3. Používanie / vkladanie vlastností

Vloženie majetku do @Hodnota anotácia je priamy:

@Value ("$ {jdbc.url}") private String jdbcUrl;

Môžeme tiež určiť predvolenú hodnotu vlastnosti:

@Value ("$ {jdbc.url: aDefaultUrl}") private String jdbcUrl;

Nové PropertySourcesPlaceholderConfigurer pridané na jar 3.1 vyriešiť zástupné symboly $ {…} v hodnotách vlastností definície fazule a @Hodnota anotácie.

Nakoniec môžeme získať hodnotu nehnuteľnosti pomocou Životné prostredie API:

@Autowired private Environment env; ... dataSource.setUrl (env.getProperty ("jdbc.url"));

4. Vlastnosti s Spring Boot

Predtým, ako sa pustíme do pokročilejších možností konfigurácie vlastností, venujme sa trochu času podpore nových vlastností v Spring Boot.

Všeobecne povedané, táto nová podpora vyžaduje menšiu konfiguráciu v porovnaní so štandardnou pružinou, čo je samozrejme jedným z hlavných cieľov Bootu.

4.1. application.properties: súbor predvolených vlastností

Boot aplikuje svoju typickú konvenciu na konfiguračný prístup k súborom vlastností. To znamená, že môžeme jednoducho dať application.properties súbor v našom src / main / resources adresár a automaticky sa zistí. Z neho potom môžeme vložiť všetky načítané vlastnosti ako obvykle.

Použitím tohto predvoleného súboru teda nemusíme výslovne registrovať a PropertySource alebo dokonca poskytnúť cestu k súboru vlastností.

Ak je to potrebné, môžeme za behu nakonfigurovať iný súbor pomocou vlastnosti prostredia:

java -jar app.jar --spring.config.location = cesta k triede: /another-location.properties

Od Spring Boot 2.3, pre konfiguračné súbory môžeme určiť aj zástupné znaky.

Napríklad môžeme nastaviť pružina.konfigurácia.miesto majetok do config / * /:

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

Týmto spôsobom Spring Boot vyhľadá konfiguračné súbory zodpovedajúce config / * / vzor adresára mimo nášho súboru jar. To sa hodí, keď máme viac zdrojov vlastností konfigurácie.

Od verzie 2.4.0, Spring Boot podporuje použitie súborov vlastností viacerých dokumentov, podobne ako to robí YAML podľa návrhu:

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

Všimnite si, že v prípade súborov vlastností pred trojčiarkovou notáciou nasleduje znak komentára (#).

4.2. Súbor vlastností špecifických pre prostredie

Ak potrebujeme zacieliť na rôzne prostredia, v Boote je pre to zabudovaný mechanizmus.

Môžeme jednoducho definovať application-environment.properties súbor v src / main / resources adresár a potom nastavte jarný profil s rovnakým názvom prostredia.

Napríklad, ak definujeme „fázové“ prostredie, znamená to, že budeme musieť definovať a inscenácia profil a potom application-staging.properties.

Tento súbor env sa načíta a bude mať prednosť pred predvoleným súborom vlastností. Upozorňujeme, že predvolený súbor sa bude stále načítať, jedná sa iba o to, že keď dôjde ku kolízii vlastnosti, má prednosť súbor vlastností špecifický pre dané prostredie.

4.3. Súbor vlastností špecifických pre test

Keď je naša aplikácia v teste, môžeme mať tiež požiadavku na použitie rôznych hodnôt vlastností.

Spring Boot to za nás zvláda pohľadom do našej src / test / zdroje adresár počas testovacej prevádzky. Predvolené vlastnosti budú opäť injektovateľné ako obvykle, ale v prípade kolízie ich tieto vlastnosti prepíšu.

4.4. The @TestPropertySource Anotácia

Ak potrebujeme podrobnejšiu kontrolu nad vlastnosťami testu, môžeme použiť @TestPropertySource anotácia.

To nám umožňuje nastaviť vlastnosti testu pre konkrétny kontext testu, ktorý má prednosť pred predvolenými zdrojmi vlastností:

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

Ak nechceme použiť súbor, môžeme priamo určiť mená a hodnoty:

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

Podobný efekt môžeme dosiahnuť aj pomocou vlastnosti argument @SpringBootTest anotácia:

@RunWith (SpringRunner.class) @SpringBootTest (properties = {"foo = bar"}, classes = SpringBootPropertiesTestApplication.class) verejná trieda SpringBootPropertyInjectionIntegrationTest {@Value ("$ {foo}") súkromné ​​reťazec foo; @Test public void whenSpringBootPropertyProvided_thenProperlyInjected () {assertThat (foo) .isEqualTo ("bar"); }}

4.5. Hierarchické vlastnosti

Ak máme vlastnosti, ktoré sú zoskupené, môžeme využiť @ConfigurationProperties anotácia, ktorá tieto hierarchie vlastností namapuje do grafov objektov Java.

Zoberme si niektoré vlastnosti používané na konfiguráciu databázového pripojenia:

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

A potom ich pomocou anotácie namapujeme na databázový objekt:

@ConfigurationProperties (prefix = "databáza") verejná trieda Databáza {String url; Reťazec užívateľské meno; Reťazcové heslo; // štandardné getre a setre}

Spring Boot opäť aplikuje svoju konvenciu na konfiguračný prístup a automaticky mapuje medzi názvami vlastností a ich príslušnými poľami. Všetko, čo musíme dodať, je predpona vlastnosti.

Ak sa chcete podrobnejšie zaoberať vlastnosťami konfigurácie, pozrite si náš podrobný článok.

4.6. Alternatíva: Súbory YAML

Jar podporuje aj súbory YAML.

Všetky rovnaké pravidlá pomenovania platia pre súbory špecifické pre test, špecifické pre prostredie aj pre predvolené súbory vlastností. Jediným rozdielom je prípona súboru a závislosť od knižnice SnakeYAML, ktorá je na našej triede.

YAML je obzvlášť vhodný na ukladanie hierarchických vlastností; nasledujúci súbor vlastností:

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

je synonymom pre nasledujúci súbor YAML:

databáza: url: jdbc: postgresql: / localhost: 5432 / používateľské meno inštancie: foo heslo: tajomstvo čiarky: foo

Za zmienku stojí aj to, že súbory YAML nepodporujú @PropertySource anotáciu, takže ak potrebujeme túto anotáciu použiť, obmedzilo by nás to použitie súboru vlastností.

Ďalším pozoruhodným bodom je, že vo verzii 2.4.0 Spring Boot zmenil spôsob načítania vlastností zo súborov YAML s viacerými dokumentmi. Predtým bolo poradie, v akom boli pridané, založené na poradí aktivácie profilu. S novou verziou sa však rámec riadi rovnakými pravidlami pre objednávanie, aké sme už skôr naznačili .vlastnosti súbory; vlastnosti deklarované nižšie v súbore jednoducho prepíšu tie vyššie.

V tejto verzii navyše nie je možné ďalej aktivovať profily z dokumentov špecifických pre daný profil, čím je výsledok jasnejší a predvídateľnejší.

4.7. Import ďalších konfiguračných súborov

Pred verziou 2.4.0, Spring Boot umožňoval vrátane ďalších konfiguračných súborov pomocou pružina.konfigurácia.miesto a spring.config.additional-location vlastnosti, ale mali určité obmedzenia. Museli byť napríklad definované pred spustením aplikácie (ako vlastnosti prostredia alebo systému alebo pomocou argumentov príkazového riadku), pretože boli použité na začiatku procesu.

V spomínanej verzii môžeme použiť pružina.konfigurácia.import majetok v rámci application.properties alebo aplikácia.yml súbor, aby bolo možné ľahko zahrnúť ďalšie súbory. Táto vlastnosť podporuje niektoré zaujímavé funkcie:

  • pridanie niekoľkých súborov alebo adresárov
  • súbory je možné načítať z triedy alebo z externého adresára
  • označuje, či má proces spustenia zlyhať, ak sa nenájde súbor, alebo či ide o voliteľný súbor
  • import súborov bez prípony

Pozrime sa na platný príklad:

spring.config.import = classpath: additional-application.properties, classpath: additional-application [.yml], voliteľné: file: ./ external.properties, classpath: additional-application-properties /

Poznámka: tu sme túto vlastnosť naformátovali pomocou zalomení riadkov, kvôli lepšej prehľadnosti.

Jar bude považovať dovoz za nový dokument vložený bezprostredne pod dovozné vyhlásenie.

4.8. Vlastnosti z argumentov príkazového riadku

Okrem použitia súborov môžeme vlastnosti odovzdať priamo na príkazovom riadku:

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

Môžeme to urobiť aj prostredníctvom vlastností systému, ktoré sú poskytované pred -jar skôr ako po ňom:

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

4.9. Vlastnosti z premenných prostredia

Spring Boot tiež detekuje premenné prostredia a zaobchádza s nimi ako s vlastnosťami:

export name = hodnota java -jar app.jar 

4.10. Randomizácia majetkových hodnôt

Ak nechceme deterministické hodnoty vlastností, môžeme použiť RandomValuePropertySource na randomizáciu hodnôt vlastností:

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

4.11. Ďalšie typy zdrojov majetku

Spring Boot podporuje množstvo zdrojov nehnuteľností a implementuje premyslenú objednávku, ktorá umožňuje rozumné prepísanie. Stojí za to nahliadnuť do oficiálnej dokumentácie, ktorá presahuje rámec tohto článku.

5. Konfigurácia pomocou funkcie Raw Beans - PropertySourcesPlaceholderConfigurer

Okrem pohodlných metód načítania vlastností do jari môžeme tiež definovať a regulovať fazónu konfigurácie vlastností ručne.

Práca s PropertySourcesPlaceholderConfigurer nám dáva úplnú kontrolu nad konfiguráciou, pričom nevýhodou je, že sú podrobnejšie a väčšinou zbytočné.

Pozrime sa, ako môžeme túto fazuľu definovať pomocou konfigurácie Java:

@Bean public static PropertySourcesPlaceholderConfigurer properties () {PropertySourcesPlaceholderConfigurer pspc = nový PropertySourcesPlaceholderConfigurer (); Zdroj [] resources = new ClassPathResource [] {new ClassPathResource ("foo.properties")}; pspc.setLocations (zdroje); pspc.setIgnoreUnresolvablePlaceholders (true); vrátiť pspc; }

6. Vlastnosti v kontextoch rodič - dieťa

Znovu a znovu sa vynára táto otázka: Čo sa stane, keď bude naša webová aplikácia má nadradený a podradený kontext? Nadradený kontext môže mať niektoré spoločné základné funkcie a fazuľa, a potom jeden (alebo viac) podradených kontextov, ktoré môžu obsahovať fazule špecifické pre servlet.

V takom prípade je najlepší spôsob definovania súborov vlastností a ich zahrnutia do týchto kontextov? A ako najlepšie tieto vlastnosti získať z jari?

Dáme jednoduchý rozpis.

Ak je súbor definované v nadradenom kontexte:

  • @Hodnota pracuje v Kontext dieťaťa: ÁNO
  • @Hodnota pracuje v Nadradený kontext: ÁNO
  • environment.getProperty v Kontext dieťaťa: ÁNO
  • environment.getProperty v Nadradený kontext: ÁNO

Ak je súbor definované v kontexte dieťaťa:

  • @Hodnota pracuje v Kontext dieťaťa: ÁNO
  • @Hodnota pracuje v Nadradený kontext: NIE
  • environment.getProperty v Kontext dieťaťa: ÁNO
  • environment.getProperty v Nadradený kontext: NIE

7. Záver

Tento článok ukázal niekoľko príkladov práce s vlastnosťami a súbormi vlastností na jar.

Celý kód podporujúci článok je ako vždy k dispozícii na GitHub.


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