javascript
SpringBoot基础篇配置信息之配置刷新
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
更多Spring文章,歡迎點擊 一灰灰Blog-Spring專題
配置的刷新,從第一篇就提出了這個問題,但是一直都沒有說到,那么配置加載完畢之后能否在主動刷新呢?
如果對SpringCloud有了解的話,會直到有個配置中心的微服務(wù),專門就是來做配置遠程拉取,當(dāng)然也支持刷新了,這是否意味著可以支持刷新呢,如果支持該怎么做?
<!-- more -->
I. 配置動態(tài)刷新
本篇將介紹并演示如何實現(xiàn)配置信息的刷新,但不會涉及到底層的實現(xiàn)原理,想要探究里面的神奇,可以網(wǎng)上google一下,或者期待后續(xù)的源碼分析篇
1. ContextReferer
我們這里主要借助這個類來實現(xiàn)配置刷新,至于從哪里撈出來的這個東西,從Spring-Cloud-Config出發(fā),看了下它怎么玩的,然后依葫蘆畫瓢
這個類全路徑為 org.springframework.cloud.context.refresh.ContextRefresher,因此你的SpringBoot項目需要做一點修改
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId></dependency> </dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies> </dependencyManagement>接下來就簡單了,直接調(diào)用這個類的refresh()方法就可以了,just so easy~
2. 代碼演示
配置文件: application.yml
biz:refresh: ${random.long}key: refresh-testrest:uuid: ${random.uuid}server:port: 8081讀取配置的bean,演示了兩種獲取方式,分別如下
@Data @Component @ConfigurationProperties(prefix = "biz") public class BizConfig {private String key;private Long refresh; }開啟刷新的@Value注解方式,注意下面的@RefreshScoe注解,這個必須有,負(fù)責(zé)更新后的配置不會同步
@Data @RefreshScope @Component public class ValueConfig {@Value("${rest.uuid}")private String uuid; }測試Controller如下
@RestController public class DemoController {@Autowiredprivate ContextRefresher contextRefresher;@Autowiredprivate BizConfig bizConfig;@Autowiredprivate ValueConfig valueConfig;@GetMapping(path = "/show")public String show() {JSONObject res = new JSONObject();res.put("biz", JSONObject.toJSONString(bizConfig));res.put("uuid", valueConfig.getUuid());return res.toJSONString();}@GetMapping(path = "/refresh")public String refresh() {new Thread(() -> contextRefresher.refresh()).start();return show();} }3. 實例演示
啟動上面的應(yīng)用,然后開啟愉快的測試,調(diào)用refresh接口,發(fā)現(xiàn)每次的返回都不一樣(因為配置文件使用了random隨機生成),但是訪問show接口時,每次返回的都是一樣的,也就是說refresh接口中確實實現(xiàn)了配置的刷新
說明
- 使用ConfigurationProperties方式獲取注解時,自動支持刷新配置
- 使用@Value注解的方式,需要開啟@RefreshScope注解(上面沒有演示不開啟這個注解的情況, 建議有興趣的可以自己嘗試一下)
II. 配置變更監(jiān)聽
既然配置能刷新,那么如果我希望獲取配置變更的事件,然后做一些其他的事情,是否ok呢?
其實進入 ContextRefresher 的源碼,看下refresh接口,就很明確了
public synchronized Set<String> refresh() {Map<String, Object> before = extract(this.context.getEnvironment().getPropertySources());addConfigFilesToEnvironment();Set<String> keys = changes(before,extract(this.context.getEnvironment().getPropertySources())).keySet();// 注意這一行,拋出了一個變更事件this.context.publishEvent(new EnvironmentChangeEvent(context, keys));this.scope.refreshAll();return keys; }1. 配置變更監(jiān)聽
從上面的源碼中,借助spring的事件通知機制,很簡單就可以知道該怎么做了,來一個簡單的demo,這里順帶測試下上面漏掉的不刷新的場景
@RestController public class DemoController {@Autowiredprivate ContextRefresher contextRefresher;@Autowiredprivate BizConfig bizConfig;@Autowiredprivate ValueConfig valueConfig;@Value("${rest.uuid}")private String uuid;@GetMapping(path = "/show")public String show() {JSONObject res = new JSONObject();res.put("biz", JSONObject.toJSONString(bizConfig));res.put("uuid", valueConfig.getUuid());res.put("no-refresh", uuid);return res.toJSONString();}@GetMapping(path = "/refresh")public String refresh() {new Thread(() -> contextRefresher.refresh()).start();return show();}@EventListenerpublic void envListener(EnvironmentChangeEvent event) {System.out.println("conf change: " + event);} }直接將Listener寫在Controller類內(nèi)部... 原則上不推薦上面的寫法
2. 實測
依然來個實測,主要注意下控制臺的輸出即可
III. 其他
0. 項目
- 工程:spring-boot-demo
- modal: spring-boot-demo#002-properties
1. 一灰灰Blog
- 一灰灰Blog個人博客 https://blog.hhui.top
- 一灰灰Blog-Spring專題博客 http://spring.hhui.top
一灰灰的個人博客,記錄所有學(xué)習(xí)和工作中的博文,歡迎大家前去逛逛
2. 聲明
盡信書則不如,已上內(nèi)容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發(fā)現(xiàn)bug或者有更好的建議,歡迎批評指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 掃描關(guān)注
一灰灰blog
知識星球
轉(zhuǎn)載于:https://my.oschina.net/u/566591/blog/2245509
總結(jié)
以上是生活随笔為你收集整理的SpringBoot基础篇配置信息之配置刷新的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序 - 实现购物车结算
- 下一篇: JavaScript 验证API