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:
- 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.
- 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”).
- @Érték - Be tudunk injektálni egy adott tulajdonságot egy babba a @Value ($ {’property '}) annotáció.
- @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: Akkor importáljunk is tavasz-felhő-függőségek: És akkor hozzátesszük tavasz-felhő-indító: Végül engedélyezzük a végpont frissítését: 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. Mutassuk meg, hogyan kell használni @ConfigurationProperties val vel @RefreshScope: 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. Hozzuk létre a mintakomponensünket: 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. 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. org.springframework.boot spring-boot-starter-actuator
org.springframework.cloud tavaszi-felhő-függőségek $ {spring-cloud.version} pom import Greenwich.SR1
org.springframework.cloud tavasz-felhő-indító
management.endpoints.web.exposure.include = frissítés
4.1. Frissítse a babot a @ConfigurationProperties
@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}
4.2. Frissítse a babot a @Érték
@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}
5. Következtetés