A tulajdonságfájlok újratöltése tavasszal

1. Áttekintés

Ebben az oktatóanyagban bemutatjuk a tulajdonságok újratöltését egy Spring alkalmazásban.

2. Tulajdonságok olvasása tavasszal

Különböző lehetőségeink vannak a tavaszi ingatlanok elérésére:

  1. Környezet - Adhatunk injekciót Környezet majd használd Környezet # getProperty adott tulajdonság elolvasására. Környezet különböző tulajdonságforrásokat tartalmaz, például a rendszer tulajdonságait, -D paraméterek, és application.properties (.yml). Ezenkívül további ingatlanforrások is hozzáadhatók a Környezet felhasználásával @PropertySource.
  2. Tulajdonságok - Betölthetjük a tulajdonságfájlokat a Tulajdonságok Például, akkor használja egy babban hívással tulajdonságok.get („tulajdonság”).
  3. @Érték - Be tudunk injektálni egy adott tulajdonságot egy babba a @Value ($ {’property '}) annotáció.
  4. @ConfigurationProperties - tudjuk használni @ConfigurationProperties hogy hierarchikus tulajdonságokat töltsön be egy babban.

3. A tulajdonságok újratöltése a külső fájlból

Ha egy fájl tulajdonságait futás közben szeretnénk megváltoztatni, akkor a fájlt valahol az edényen kívül kell elhelyeznünk. Ezután a parancssor segítségével elmondjuk Springnek, hogy hol vanparaméter –Spring.config.location = fájl: // {a fájl elérési útja}. Vagy be is tehetjük alkalmazás.tulajdonságok.

A fájl alapú tulajdonságokban ki kell választanunk a fájl újratöltésének módját. Például kifejleszthetünk egy végpontot vagy ütemezőt a fájl olvasására és a tulajdonságok frissítésére.

A fájl újratöltéséhez az egyik praktikus könyvtár az Apache commons-konfiguráció. Tudjuk használni PropertiesConfiguration mással ReloadingStrategy.

Tegyük hozzá commons-konfiguráció a miénknek pom.xml:

 commons-configuration commons-configuration 1.10 

Ezután hozzáadunk egy metódust a PropertiesConfiguration bab, amelyet később felhasználunk:

@Bean @ConditionalOnProperty (name = "spring.config.location", matchIfMissing = false) public PropertiesConfiguration propertiesConfiguration (@Value ("$ {spring.config.location}") Karakterlánc útvonala) kivételt dob ​​{String filePath = új fájl (elérési út .substring ("file:". length ())). getCanonicalPath (); PropertiesConfiguration configuration = új PropertiesConfiguration (új File (filePath)); configuration.setReloadingStrategy (új FileChangedReloadingStrategy ()); visszatérési konfiguráció; }

A fenti kódban beállítottuk FileChangedReloadingStrategy mint újratöltési stratégia alapértelmezett frissítési késleltetéssel. Ez azt jelenti PropertiesConfiguration ellenőrzi a fájl módosítási dátumát ha az utolsó ellenőrzése 5000 ms-val ezelőtt volt.

A késleltetést testreszabhatjuk FileChangedReloadingStrategy # setRefreshDelay.

3.1. Újratöltés Környezet Tulajdonságok

Ha egy anon keresztül szeretnénk betölteni a betöltött tulajdonságokat Környezet például muszáj kiterjeszti a PropertySource majd használd PropertiesConfiguration hogy új értékeket adjon vissza a külső tulajdonságfájlból.

Kezdjük a PropertySource:

a ReloadablePropertySource nyilvános osztály kiterjeszti a PropertySource {PropertiesConfiguration propertiesConfiguration; public ReloadablePropertySource (karakterlánc neve, PropertiesConfiguration tulajdonságokConfiguration) {super (név); this.propertiesConfiguration = propertiesConfiguration; } public ReloadablePropertySource (karakterlánc neve, karakterlánc-elérési út) {super (StringUtils.hasText (név)? elérési út: név); próbálja meg az {this.propertiesConfiguration = new PropertiesConfiguration (elérési út); this.propertiesConfiguration.setReloadingStrategy (új FileChangedReloadingStrategy ()); } catch (e kivétel) {dobja új PropertiesException (e); }} @Orride public Object getProperty (String s) {return propertiesConfiguration.getProperty (s); }}

Felülírtuk a getProperty módszer, hogy átruházza PropertiesConfiguration # getProperty. Ezért időközönként ellenőrzi a frissített értékeket a frissítési késleltetésünknek megfelelően.

Most hozzá fogjuk adni ReloadablePropertySource nak nek KörnyezetIngatlan forrásai:

@Configuration public class ReloadablePropertySourceConfig {private ConfigurableEnvironment env; public ReloadablePropertySourceConfig (@Autowired ConfigurableEnvironment env) {this.env = env; } @Bean @ConditionalOnProperty (name = "spring.config.location", matchIfMissing = false) public ReloadablePropertySource reloadablePropertySource (PropertiesConfiguration properties) {ReloadablePropertySource ret = new ReloadablePropertySource ("dynamic", properties); MutablePropertySources sources = env.getPropertySources (); források.addFirst (ret); visszatér ret; }}

Első elemként felvettük az új tulajdonságforrást mert azt akarjuk, hogy minden létező tulajdonságot felülírjon ugyanazzal a kulccsal.

Hozzunk létre egy babot, amelyből leolvashatunk egy tulajdonságot Környezet:

@Component public class EnvironmentConfigBean {private Environment environment; public EnvironmentConfigBean (@Autowired Environment environment) {this.környezet = környezet; } public String getColor () {return environment.getProperty ("application.theme.color"); }}

Ha más újratölthető külső tulajdonságforrásokat kell hozzáadnunk, először be kell vezetnünk a szokásunkat PropertySourceFactory:

a public class ReloadablePropertySourceFactory kiterjeszti a DefaultPropertySourceFactory {@Orride public PropertySource createPropertySource (String s, EncodedResource encodedResource) dobja az IOException {Resource internal = encodedResource.getResource (); if (a FileSystemResource belső példánya) új ReloadablePropertySource (s, (((FileSystemResource) internal) .getPath ()) parancsot ad vissza; if (a FileUrlResource belső példánya) új ReloadablePropertySource (s, (((FileUrlResource) belső) eredményt ad vissza .getURL () .getPath ()); return super.createPropertySource (s, encodedResource); }}

Ezután egy komponens osztályát feljegyezhetjük @PropertySource:

@PropertySource (érték = "fájl: elérési út a konfigurációig", gyár = ReloadablePropertySourceFactory.class)

3.2. A tulajdonságok példányának újratöltése

Környezet jobb választás, mint Tulajdonságok, különösen akkor, ha a tulajdonságokat újra kell töltenünk egy fájlból. Ha azonban szükségünk van rá, kibővíthetjük a java.util.Tulajdonságok:

a public class ReloadableProperties kiterjeszti a Properties {private PropertiesConfiguration propertiesConfiguration tulajdonságokat; public ReloadableProperties (PropertiesConfiguration propertiesConfiguration) dobja az IOException {super.load (új FileReader (propertiesConfiguration.getFile ())); this.propertiesConfiguration = propertiesConfiguration; } @Orride public String getProperty (String key) {String val = propertiesConfiguration.getString (kulcs); super.setProperty (kulcs, val); visszatérő val; } // egyéb felülírások}

Felülírtuk getProperty és annak túlterhelését, majd átruházta a PropertiesConfiguration példa. Most létrehozhatunk egy ilyen osztályú babot, és befecskendezhetjük az összetevőinkbe.

3.3. Bean újratöltése @ConfigurationProperties

Hogy ugyanazt a hatást érje el a @ConfigurationProperties, rekonstruálnunk kellene a példányt.

De a Spring csak új komponenseket hoz létre a prototípus vagy kérés hatálya.

Így a környezet újratöltésének technikája is nekik fog működni, de a szingulettek esetében nincs más választásunk, mint egy végpont megvalósítása a bab elpusztítására és újrateremtésére, vagy a tulajdonság újratöltésére a babon belül.

3.4. Bean újratöltése @Érték

A @Érték az annotáció ugyanazokat a korlátozásokat mutatja be, mint @ConfigurationProperties.

4. A tulajdonságok újratöltése az aktuátorral és a felhővel

A Spring Actuator különböző végpontokat nyújt az egészségre, a mutatókra és a konfigurációkra, de semmit a bab frissítésére. Ezért szükségünk van a Tavaszi Felhőre a /Frissítés végpontja annak. Ez a végpont újratölti a Környezet majd közzétesz egy EnvironmentChangeEvent.

A Tavaszi Felhő is bemutatta @RefreshScope, és használhatjuk konfigurációs osztályokhoz vagy babokhoz. Ennek eredményeként az alapértelmezett hatókör lesz Frissítés ahelyett szingli.

Használata Frissítés hatókörében a Spring törli a belső gyorsítótárát ezekről az összetevőkről egy EnvironmentChangeEvent. Ezután a bab következő hozzáférésekor új példány jön létre.

Kezdjük hozzáadással rugós-csomagtartó-indító-működtető a miénknek pom.xml:

 org.springframework.boot spring-boot-starter-actuator 

Akkor importáljunk is tavasz-felhő-függőségek:

   org.springframework.cloud tavaszi-felhő-függőségek $ {spring-cloud.version} pom import Greenwich.SR1 

És akkor hozzátesszük tavasz-felhő-indító:

 org.springframework.cloud tavasz-felhő-indító 

Végül engedélyezzük a végpont frissítését:

management.endpoints.web.exposure.include = frissítés

A Spring Cloud használatakor beállíthatunk egy Config szervert a tulajdonságok kezelésére, de folytathatjuk a külső fájljainkat is. Most két másik módszert is kezelhetünk a tulajdonságok olvasására: @Érték és @ConfigurationProperties.

4.1. Frissítse a babot a @ConfigurationProperties

Mutassuk meg, hogyan kell használni @ConfigurationProperties val vel @RefreshScope:

@Component @ConfigurationProperties (előtag = "application.theme") @RefreshScope nyilvános osztály ConfigurationPropertiesRefreshConfigBean {private String color; public void setColor (karakterlánc színe) {this.color = color; } // getter és egyéb dolgok}

A babunk azt olvassaszín" tulajdonság a gyökérből "Alkalmazás.téma" ingatlan. Ne feledje, hogy a szetter módszerre van szükségünk, Spring dokumentációja szerint.

Miután megváltoztattuk a „alkalmazás.téma.színes”Külső konfigurációs fájlunkban hívhatunk /Frissítés, így a következő hozzáféréskor megkapjuk az új értéket a babtól.

4.2. Frissítse a babot a @Érték

Hozzuk létre a mintakomponensünket:

@Component @RefreshScope nyilvános osztály ValueRefreshConfigBean {private String color; public ValueRefreshConfigBean (@Value ("$ {application.theme.color}") Karakterlánc színe) {this.color = color; } // tedd ide a getter-t}

A frissítés folyamata megegyezik a fentiekkel.

Meg kell azonban jegyezni, hogy /Frissítés nem fog működni a bab kifejezetten szingli hatálya.

5. Következtetés

Ebben az oktatóanyagban bemutattuk a tulajdonságok újratöltését a Spring Cloud szolgáltatásokkal vagy azok nélkül. Emellett bemutattuk az egyes technikák buktatóit és kivételeit.

A teljes kód elérhető a GitHub projektünkben.


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