SpringBootSpringCloud自定义配置文件(如何整合配置中心)
Spring Boot配置
在spring中我们都知道所有配置定义在配置文件 application.yml 中我们就可以通过注解获取到。
Spring 中对所有配置管理都有一个统一的上层接口 Environment
实现类图
可以看到实现类是非常多的。不过实际所有的配置获取都是封装在最上层的接口 PropertyResolver 中的
这里需要注意的是 PropertyResolver 的核心实现类 PropertySourcesPropertyResolver
而 PropertySourcesPropertyResolver 中拥有的 PropertySources 最后使用的也还是 PropertySource 类,通过遍历 PropertySource 集合
而 PropertySource 最终是通过拥有一个泛型T source获取最终的属性
所以这里可以看到我们所有的资源都是一个 PropertySource
需要注意的是,PropertySource之间是有优先级顺序的,如果有一个Key在多个 PropertySource 中都存在,那么在前面的 PropertySource 优先。
大致获取的原理这里引用apollo的一张图
这张图就是比较清晰的 简单测试使用
spring boot 版本 2.6.8
yaml 配置一个name属性 name: 1214@RestController public class EnvironementController { @Autowired Environment environment; @Value("${name}") private String name; @GetMapping("/name") public String env(){ System.out.println(name); return environment.getProperty("name"); } }
无论是使用 @Value 还是 Environment 都能获取到我们的自定义属性
然后调用接口就能获取到我们配置中的属性了
Spring Cloud自定义配置文件获取
在了解了上面的原理及基本使用之后我们可以就可以自定义配置文件了。核心思路就是通过读取文件然后加载到 PropertySource 中去。
而Spring Cloud刚好提供类这方面的扩展,Spring Cloud 提供了 PropertySourceLocator 接口供我们加载自定义配置成 PropertySource
我们这里只需要实现locate即可
按这个方式我们来自定义配置试试 1. 引入依赖 UTF-8 1.8 1.8 2021.0.2 2.7.0 org.springframework.cloud spring-cloud-context org.springframework.cloud spring-cloud-starter org.springframework.cloud spring-cloud-starter-bootstrap org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-dependencies ${spring-boot.version} pom import org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import
注意spring Cloud 2020版本后需要手动引入依赖 spring-cloud-starter-bootstrap 2. 自定义配置2.1 自定义PropertySource,这里我们直接使用Spring 提供的MapPropertySourcepackage com.zou.config; import java.util.Map; import org.springframework.core.env.MapPropertySource; /** *@author : wh *@date : 2022/7/12 09:54 *@description: */ public class ZouMapPropertySource extends MapPropertySource { /** * Create a new {@code MapPropertySource} with the given name and {@code Map}. * * @param name the associated name * @param source the Map source (without {@code null} values in order to get * consistent {@link #getProperty} and {@link #containsProperty} behavior) */ public ZouMapPropertySource(String name, Map source) { super(name, source); } }2.2 自定义PropertySourceLocatorpackage com.zou.config; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.boot.json.JsonParser; import org.springframework.boot.json.JsonParserFactory; import org.springframework.cloud.bootstrap.config.PropertySourceLocator; import org.springframework.core.annotation.Order; import org.springframework.core.env.Environment; import org.springframework.core.env.PropertySource; /** * @author : wh * @date : 2022/7/12 09:56 * @description: */ @Order(0) public class ZouJsonPropertySourceLocator implements PropertySourceLocator { @Override public PropertySource<?> locate(Environment environment) { return new ZouMapPropertySource ("ZouMapPropertySource", mapPropertySource()); } private Map mapPropertySource() { Map result = new HashMap<>(); JsonParser parser = JsonParserFactory.getJsonParser(); Map fileMap = parser.parseMap(readFile()); processNestMap("", result, fileMap); return result; } /** * 读取配置文件 zou.json * * @return */ private String readFile() { List lines; try { lines = Files.readAllLines(Paths.get("src/main/resources/zou.json"), StandardCharsets.UTF_8); } catch (IOException e) { throw new RuntimeException(e); } StringBuilder sb = new StringBuilder(); for (String line : lines) { sb.append(line); } return sb.toString(); } private void processNestMap(String prefix, Map result, Map fileMap) { if (prefix.length() > 0) { prefix += "."; } for (Map.Entry entrySet : fileMap.entrySet()) { if (entrySet.getValue() instanceof Map) { processNestMap(prefix + entrySet.getKey(), result, (Map) entrySet.getValue()); } else { result.put(prefix + entrySet.getKey(), entrySet.getValue()); } } } }2.3 自定义配置Bean config@Configuration(proxyBeanMethods = false) public class ZouConfiguration { @Bean public ZouJsonPropertySourceLocator zouJsonPropertySourceLocator(){ return new ZouJsonPropertySourceLocator(); } }2.4 定义BootstrapConfiguration配置
在 resources 添加 spring.factories 配置文件 org.springframework.cloud.bootstrap.BootstrapConfiguration= com.zou.config.ZouConfiguration3. 测试
这里简单定义一个我们自己的配置文件 zou.json
{ "name": "xiaozou" }
定义一个测试controller @RestController @RequestMapping("test/v1") public class ZouController { @Autowired Environment environment; @Value("${name:1}") private String name; @GetMapping("/name") public String env(){ System.out.println(name); return environment.getProperty("name"); } }
可以看到我们自定义配置是生效了的
Spring Cloud 整合自定义配置还是比较容易的,核心还是自定义一个 ZouJsonPropertySourceLocator 然后加载 PropertySource 到Spring中。这里我们整合的是本地文件,其实如果要整合远程配置中心也是类似的,只不过获取文件就不是读取本地配置文件,而是通过http读取远程配置文件然后构造出一个 PropertySource 放入Spring容器中。后续有机会我们对 nacos 整合 Spring Cloud 源码进行分析
首钢新主帅人选出炉,马布里续约合同添新条款,上海内线遭遇危机文小桢CBA季后赛爆出大冷门,坐拥四外援的北京首钢再次不敌单外援的吉林男篮,以大比分02惨遭淘汰出局,遭遇季后赛一轮游。赛后,首钢俱乐部官方社媒仅用对不起三个字向球迷们表示了态度,
雅尼斯将启用首钢悍将,徐长锁换人做最后一搏,青岛已签约新外援文小桢CBA季后赛第二个比赛日爆出了一个不大不小的冷门,坐拥四外援赛前高喊争冠呼声的北京首钢,被单外援仅七人轮换的吉林男篮绝杀,遭遇开门黑,如果下一场不能赢球的话,那北京首钢将被横
你的小伙伴,一起过春天气温一路走高,百花盛放景色让人流连忘返摄影师淡淡美好在樱花树下,看见了春天笑容太美,青春太美。在晴川酒店,淡淡美好抢拍下这张照片,她生活中也非常爱拍照,几乎天天都会分享作品到大武汉
麻辣烫商用配方分享给大家麻辣烫起源于岷江之滨四川省乐山市牛华镇。最初是船工和纤夫创造了麻辣烫这种简便易行而又独特的吃法。后经东北做法改良之后流行于各地的汉族特色小吃。经过东北人改良过的麻辣烫,大骨汤底,更
哪些是你心心念念想去的地方?云南有太多想去且值得去的地方啦,不仅风景美,而且景点多,可以来一个景点大串烧,观看体会各种美色美食,也省去了路上花费过多时间香格里拉,大理洱海,丽江,玉龙雪山,丽江泸沽湖,还有独具
不出京不远行,这些地方也能让清明小长假很充实清明前后,是初暖花开万物复苏的好时节,踏青赏花换新衣已经成为了朋友圈的热门话题。今年的第一个小长假,在不出京的前提下,还能避开人头涌动的打卡景点,这一份小长假逛街攻略,商业那点事儿
清明节适合旅游的地方,中国最美的寨子,确实好看有很多的朋友咨询清明节还可以去哪里游玩,今天再给大家介绍一个适合旅游的地方,中国最美的寨子,这里的每处寨子都风格各异,各具特色,这里的每一处建筑都有千百年的历史,这里的每一处人文景
经常吃烧烤对身体有什么影响?现在有不少人在聚会的时候会一起聚会吃烧烤,烧烤的味道是比较鲜美的,受很多人的欢迎,但是长期吃烧烤,对人体健康有不利影响,大家都知道吸烟有害人体健康,长时间的吸烟会严重的影响人体各个
亚马逊全球开店需要投入多少钱?做生意,怎么能不关心成本!下面以北美站为例,来看看亚马逊平台开店都涉及到哪些基本费用。一月租费专业卖家39。39美元月个人卖家无月租费用可以看出,月租主要针对专业卖家,无月租也是个
华为更换最高领导人,孟晚舟即将接班华为官网最新消息,2022年4月1日2022年9月30日期间由胡厚崑先生当值轮值董事长,华为公司董事会及董事会常务委员会由轮值董事长主持,轮值董事长在当值期间是公司最高领袖,轮值董
腾讯元老魏震赚够钱后果断辞职,携妻儿退隐山林,每天种地喝茶在智能手机还没有普及的年代,电脑使95后孩子们的童年增彩。当时是中国网络发展最快,也是变革最大的时代,中国赶上了这一次科技革命的浪潮,在2000年之后,五光十色的网络让人们第1次那