前面一篇博文介绍了一个@Value的一些知识点,其中提了一个点,@Value对应的配置,除了是配置文件中之外,可以从其他的数据源中获取么,如从redis,db,http中获取配置?
了解过SpringCloud Config的可以给出确切的答案,可以,而且用起来还老爽了,远程配置,支持配置动态刷新,接下来我们来看一下,在SpringBoot中,如何配置自定义的数据源
I. 项目环境
1. 项目依赖
本项目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA进行开发
开一个web服务用于测试
1 | <dependencies> |
II. 自定义配置源
@Value修饰的成员,绑定配置时,是从Envrionment中读取配置的,所以我们需要做的就是注册一个自定义的配置源,借助MapPropertySource可以来实现我们需求场景
1. 自定义数据源
演示一个最简单自定义的配置数据源,重写MapPropertySource的getProperties方法
实现如下
1 | public class SimplePropertiesSource extends MapPropertySource { |
2. 数据源注册
上面只是声明了配置源,接下来把它注册到Environment中,这样就可以供应用使用了
1 |
|

从上面的输出可以看出,自定义配置开头的会获取到随机的配置值;非selfdefine开头的,没有相应的配置,返回空
3. 基于文件的自定义配置源
上面这个可能有点过于儿戏了,接下来我们将配置源放在自定义的文件中,并支持文件配置修改
1 | public class FilePropertiesSource extends MapPropertySource { |
上面写了一个定时器,每10s刷新一下内存中的配置信息,当然这里也是可以配置一个文件变动监听器,相关有兴趣的话,可以看下Java实现文件变动的监听可以怎么玩
对应的配置文件
1 | user=xhh |
注册的姿势与上面一致,就不单独说明了,接下来演示一下使用

从上可以看到文件中的配置修改之后,过一段时间会刷新
4. @Value绑定自定义配置
接下来我们看一下,将@Value绑定自定义的配置,是否可以成功
调整一下上面的Application, 添加一个成员属性
1 | ("${name}") |
再次测试发现抛异常了,说是这个配置不存在!!!

(这就过分了啊,看了半天,结果告诉我不行,这还不得赶紧搞个差评么😡😡😡)
已经写到这里了,当然我也得继续尝试挽救一下,为啥前面直接通过Environment可以拿到配置,但是@Value注解绑定就不行呢?
”罪魁祸首“就在于初始化顺序,我自定义的配置源,还没有塞到Envrionment,你就开会着手绑定了,就像准备给”一灰灰blog“一个差评,结果发现还没关注…(好吧,我承认没关注也可以评论😭)
根据既往的知识点(至于是哪些知识点,那就长话短说不了了,看下面几篇精选的博文吧)
- 【SpringBoot基础系列-实战】如何指定 bean 最先加载(应用篇)
- SpringBoot系列教程之Bean之指定初始化顺序的若干姿势
- SpringBoot系列教程之Bean加载顺序之错误使用姿势辟谣
要解决这个问题,一个最简单的方式如下
创建一个独立的配置类,实现自定义数据源的注册
1 |
|
测试类上指定bean依赖
1 | ("filePropertiesSource") |
再次测试,结果如下

从上面的演示动图可以看到,绑定自定义的数据源配置,没有问题,但是,当配置变更时,绑定的name字段,没有随之更新
简单来讲就是不支持动态刷新,这就难受了啊,我就想要动态刷新,那该怎么搞?
- 不要急,新的博文已经安排上了,下篇奉上(怕迷路的小伙伴,不妨关注一下”一灰灰blog“🐺)
5. 小结
最后按照惯例小结一下,本文篇幅虽长,但知识点比较集中,总结下来,两句话搞定
- 通过继承
MapPropertySource来实现自定义配置源,注册到Envrionment可供@Value使用 - 使用
@Value绑定自定义配置源时,注意注册的顺序要早于bean的初始化
好的,到这里正文结束, 我是一灰灰,欢迎各位大佬来踩一踩长草的公众号”一灰灰blog”
III. 不能错过的源码和相关知识点
0. 项目
- 工程:https://github.com/liuyueyi/spring-boot-demo
- 源码: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/002-dynamic-envronment
配置系列博文
- 【SpringBoot 基础系列】@Value 中哪些你不知道的知识点
- 【SpringBoot 基础系列】ConfigurationProperties 配置绑定中那些你不知道的事情
- 【SpringBoot 基础系列】SpringBoot 配置篇之 PropertySource 加载 Yaml 配置文件实例演示
- 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)
- SpringBoot基础篇配置信息之配置刷新
- SpringBoot基础篇配置信息之自定义配置指定与配置内引用
- SpringBoot基础篇配置信息之多环境配置信息
- SpringBoot基础篇配置信息之如何读取配置信息
1. 一灰灰Blog
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
- 一灰灰Blog个人博客 https://blog.hhui.top
- 一灰灰Blog-Spring专题博客 http://spring.hhui.top
