Načítanie súborov vlastností na jar

1. Prehľad

V tomto tutoriáli si ukážeme, ako znovu načítať vlastnosti v jarnej aplikácii.

2. Vlastnosti čítania na jar

Máme rôzne možnosti prístupu k vlastnostiam na jar:

  1. Životné prostredie - Môžeme vstreknúť Životné prostredie a potom použite Prostredie # getProperty prečítať danú vlastnosť. Životné prostredie obsahuje rôzne zdroje vlastností, ako napríklad vlastnosti systému, -D parametre a application.properties (.yml). Do súboru možno tiež pridať ďalšie zdroje majetku Životné prostredie použitím @PropertySource.
  2. Vlastnosti - Môžeme načítať súbory vlastností do a Vlastnosti inštanciu, potom ju použite v fazuli zavolaním properties.get („vlastnosť“).
  3. @Hodnota - Môžeme vložiť konkrétnu vlastnosť do fazule pomocou: @Value ($ {‘property '}) anotácia.
  4. @ConfigurationProperties - môžeme použiť @ConfigurationProperties načítať hierarchické vlastnosti do fazule.

3. Opätovné načítanie vlastností z externého súboru

Ak chcete zmeniť vlastnosti súboru počas behu programu, mali by sme tento súbor umiestniť niekde mimo jar. Potom pomocou príkazového riadku povieme Springu, kde to jeparameter –Spring.config.location = súbor: // {cesta k súboru}. Alebo to môžeme vložiť application.properties.

Vo vlastnostiach založených na súboroch si budeme musieť zvoliť spôsob, ako súbor znova načítať. Napríklad môžeme vyvinúť koncový bod alebo plánovač na čítanie súboru a aktualizáciu vlastností.

Jednou z praktických knižníc na opätovné načítanie súboru je Apache spoločná konfigurácia. Môžeme použiť Vlastnosti Konfigurácia s rôznymi ReloadingStrategy.

Pridajme spoločná konfigurácia k nášmu pom.xml:

 Commons-Configuration Commons-Configuration 1.10 

Potom pridáme metódu na vytvorenie a Vlastnosti Konfigurácia fazuľa, ktorú použijeme neskôr:

@Bean @ConditionalOnProperty (name = "spring.config.location", matchIfMissing = false) public PropertiesConfiguration propertiesConfiguration (@Value ("$ {spring.config.location}") reťazcová cesta) vyvolá výnimku {reťazec filePath = nový súbor (cesta) .substring ("súbor:". dĺžka ())). getCanonicalPath (); Konfigurácia PropertiesConfiguration = nová PropertiesConfiguration (nový súbor (filePath)); configuration.setReloadingStrategy (nový FileChangedReloadingStrategy ()); návratová konfigurácia; }

Vo vyššie uvedenom kóde sme nastavili FileChangedReloadingStrategy ako stratégia opätovného načítania s predvoleným oneskorením obnovenia. To znamená, že Vlastnosti Konfigurácia skontroluje dátum zmeny súboru ak bola jeho posledná kontrola pred 5 000 ms.

Oneskorenie môžeme prispôsobiť pomocou FileChangedReloadingStrategy # setRefreshDelay.

3.1. Prebíjanie Životné prostredie Vlastnosti

Ak chceme znovu načítať vlastnosti načítané cez Životné prostredie napríklad musíme predĺžiť PropertySource a potom použite Vlastnosti Konfigurácia vráti nové hodnoty zo súboru externých vlastností.

Začnime rozšírením PropertySource:

verejná trieda ReloadablePropertySource rozširuje PropertySource {PropertiesConfiguration propertiesConfiguration; public ReloadablePropertySource (názov reťazca, PropertiesConfiguration propertiesConfiguration) {super (meno); this.propertiesConfiguration = propertiesConfiguration; } public ReloadablePropertySource (názov reťazca, cesta reťazca) {super (StringUtils.hasText (názov)? cesta: názov); try {this.propertiesConfiguration = new PropertiesConfiguration (cesta); this.propertiesConfiguration.setReloadingStrategy (nový FileChangedReloadingStrategy ()); } catch (Výnimka e) {hodiť novú PropertiesException (e); }} @Override public Object getProperty (String s) {return propertiesConfiguration.getProperty (s); }}

Prekonali sme getProperty spôsob delegovania na Vlastnosti Konfigurácia # getProperty. Preto bude v intervaloch kontrolovať aktualizované hodnoty podľa nášho oneskorenia obnovenia.

Teraz pridáme naše ReloadablePropertySource do Životné prostredieZdroje majetku:

@Configuration verejná trieda ReloadablePropertySourceConfig {private ConfigurableEnvironment env; public ReloadablePropertySourceConfig (@Autowired ConfigurableEnvironment env) {this.env = env; } @Bean @ConditionalOnProperty (name = "spring.config.location", matchIfMissing = false) public ReloadablePropertySource reloadablePropertySource (vlastnosti PropertiesConfiguration) {ReloadablePropertySource ret = nový ReloadablePropertySource ("dynamický", vlastnosti); MutablePropertySources sources = env.getPropertySources (); sources.addFirst (ret); návrat ret; }}

Nový zdroj vlastnosti sme pridali ako prvú položku pretože chceme, aby prepísala akúkoľvek existujúcu vlastnosť rovnakým kľúčom.

Vytvorme fazuľu, z ktorej sa má načítať vlastnosť Životné prostredie:

@Component public class EnvironmentConfigBean {súkromné ​​prostredie prostredia; public EnvironmentConfigBean (@Autowired Environment environment) {this.environment = environment; } public String getColor () {return environment.getProperty ("application.theme.color"); }}

Ak potrebujeme pridať ďalšie obnoviteľné zdroje externých vlastností, najskôr musíme implementovať náš vlastný PropertySourceFactory:

public class ReloadablePropertySourceFactory extends DefaultPropertySourceFactory {@Override public PropertySource createPropertySource (String s, EncodedResource encodedResource) throws IOException {Resource internal = encodedResource.getResource (); if (internal instanceof FileSystemResource) return new ReloadablePropertySource (s, (((FileSystemResource) internal) .getPath ()); if (internal instanceof FileUrlResource) return new ReloadablePropertySource (s, (((FileUrlResource) internal) .getURL () .getPath ()); návrat super.createPropertySource (s, encodedResource); }}

Potom môžeme anotovať triedu komponentu pomocou @PropertySource:

@PropertySource (hodnota = "súbor: cesta k konfigurácii", továreň = ReloadablePropertySourceFactory.class)

3.2. Opätovné načítanie inštancie vlastností

Životné prostredie je lepšia voľba ako Vlastnosti, najmä keď potrebujeme znova načítať vlastnosti zo súboru. Ak to však potrebujeme, môžeme predĺžiť java.util.Vlastnosti:

verejná trieda ReloadableProperties rozširuje vlastnosti {private PropertiesConfiguration propertiesConfiguration; public ReloadableProperties (PropertiesConfiguration propertiesConfiguration) hodí IOException {super.load (new FileReader (propertiesConfiguration.getFile ())); this.propertiesConfiguration = propertiesConfiguration; } @Override public String getProperty (reťazcový kľúč) {reťazec val = propertiesConfiguration.getString (kľúč); super.setProperty (key, val); spätný val; } // ďalšie prepísania}

Prekonali sme getProperty a jeho preťaženia, potom ho delegoval na a Vlastnosti Konfigurácia inštancia. Teraz môžeme vytvoriť fazuľu tejto triedy a vstreknúť ju do našich komponentov.

3.3. Prebíjanie fazule pomocou @ConfigurationProperties

Rovnaký efekt získate pomocou @ConfigurationProperties, potrebovali by sme zrekonštruovať inštanciu.

Jar však vytvorí iba novú inštanciu komponentov s prototyp alebo žiadosť rozsah.

Pre nich teda bude fungovať aj naša technika opätovného načítania prostredia, ale pre singletonov nemáme inú možnosť, ako implementovať koncový bod na zničenie a opätovné vytvorenie fazule alebo na zvládnutie načítania vlastnosti vo vnútri samotnej fazule.

3.4. Prebíjanie fazule pomocou @Hodnota

The @Hodnota anotácia predstavuje rovnaké obmedzenia ako @ConfigurationProperties.

4. Opätovné načítanie vlastností pomocou aktuátora a cloudu

Spring Actuator poskytuje rôzne koncové body pre zdravie, metriky a konfigurácie, ale nič pre osvieženie fazule. Potrebujeme teda, aby Spring Cloud pridal a /Obnoviť koncový bod. Tento koncový bod znovu načíta všetky zdroje majetku z Životné prostredie a potom zverejní EnvironmentChangeEvent.

Zaviedol aj Spring Cloud @RefreshScopea môžeme ho použiť pre konfiguračné triedy alebo fazuľa. Vo výsledku bude predvolený rozsah Obnoviť namiesto singleton.

Použitím Obnoviť rozsahu, Spring vyčistí svoju internú cache týchto komponentov na EnvironmentChangeEvent. Potom sa pri ďalšom prístupe k fazuli vytvorí nová inštancia.

Začnime pridaním aktivátor pružiny-štartéra-štartéra k nášmu pom.xml:

 org.springframework.boot spring-boot-starter-aktuator 

Potom tiež importujme závislosti jar-oblak:

   org.springframework.cloud spring-cloud-dependencies $ {spring-cloud.version} pom import Greenwich.SR1 

A potom pridáme štartér jar-oblak:

 org.springframework.cloud spring-cloud-starter 

Nakoniec povolíme obnovovací koncový bod:

management.endpoints.web.exposure.include = obnoviť

Keď používame Spring Cloud, môžeme nastaviť server Config na správu vlastností, ale môžeme pokračovať aj s našimi externými súbormi. Teraz môžeme zvládnuť ďalšie dve metódy čítania vlastností: @Hodnota a @ConfigurationProperties.

4.1. Obnovte fazuľa pomocou @ConfigurationProperties

Poďme si ukázať, ako sa používa @ConfigurationProperties s @RefreshScope:

@Component @ConfigurationProperties (prefix = "application.theme") @RefreshScope verejná trieda ConfigurationPropertiesRefreshConfigBean {súkromná farba reťazca; public void setColor (farba reťazca) {this.color = color; } // getter a ďalšie veci}

Naša fazuľa číta „farba ” vlastnosť z koreňa „Žiadosť.téma “ nehnuteľnosť. Upozorňujeme, že podľa dokumentácie Springu potrebujeme metódu setter.

Po zmene hodnoty „application.theme.color”V našom externom konfiguračnom súbore môžeme zavolať /Obnoviť, tak potom môžeme získať novú hodnotu z fazule pri ďalšom prístupe.

4.2. Obnovte fazuľa pomocou @Hodnota

Vytvorme našu ukážkovú súčasť:

@Component @RefreshScope verejná trieda ValueRefreshConfigBean {súkromná farba reťazca; public ValueRefreshConfigBean (@Value ("$ {application.theme.color}") Farba reťazca) {this.color = color; } // sem vložte getter}

Proces obnovenia je rovnaký ako vyššie.

Je však potrebné poznamenať, že /Obnoviť nebude fungovať pre fazuľa s explicitným singleton rozsah.

5. Záver

V tomto tutoriáli sme si ukázali, ako znovu načítať vlastnosti s funkciami Spring Cloud alebo bez nich. Ukázali sme tiež úskalia a výnimky každej z týchto techník.

Celý kód je k dispozícii v našom projekte GitHub.


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