在我们的日常开发中,使用@Value
来绑定配置属于非常常见的基础操作,但是这个配置注入是一次性的,简单来说就是配置一旦赋值,则不会再修改; 通常来讲,这个并没有什么问题,基础的 SpringBoot 项目的配置也基本不存在配置变更,如果有使用过 SpringCloudConfig 的小伙伴,会知道@Value
可以绑定远程配置,并支持动态刷新
接下来本文将通过一个实例来演示下,如何让@Value
注解支持配置刷新;本文将涉及到以下知识点
- BeanPostProcessorAdapter + 自定义注解:获取支持自动刷新的配置类
- MapPropertySource:实现配置动态变更
I. 项目环境
1. 项目依赖
本项目借助SpringBoot 2.2.1.RELEASE
+ maven 3.5.3
+ IDEA
进行开发
开一个 web 服务用于测试
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
II. 配置动态刷新支持
1. 思路介绍
要支持配合的动态刷新,重点在于下面两点
- 如何修改
Environment
中的配置源 - 配置变更之后,如何通知到相关的类同步更新
2. 修改配置
相信很多小伙伴都不会去修改Environment
中的数据源,突然冒出一个让我来修改配置源的数据,还是有点懵的
当我们知道如何去自定义配置源之后,再来修改数据源,就会有一点思路了
定义一个配置文件application-dynamic.yml
xhh:
dynamic:
name: 一灰灰blog
然后在主配置文件中使用它
spring:
profiles:
active: dynamic
使用配置的 java config
@Data
@Component
public class RefreshConfigProperties {
@Value("${xhh.dynamic.name}")
private String name;
@Value("${xhh.dynamic.age:18}")
private Integer age;
@Value("hello ${xhh.dynamic.other:test}")
private String other;
}
接下来进入修改配置的正题
@Autowired
ConfigurableEnvironment environment