spring boot 动态修改配置分启动前注入(通过applicationcontextinitializer)、运行时刷新(@refreshscope+actuator)、环境前缀适配(environmentpostprocessor)及配置中心集成(如nacos)四类方案,各适用于不同场景。

Spring Boot 项目实现动态修改配置属性,核心在于区分两个阶段:应用启动前干预和运行时刷新。前者确保配置在 Bean 初始化前生效,后者支持不重启更新已加载的 Bean 属性。关键不是“能不能改”,而是“改完是否被新创建或重载的 Bean 感知到”。
启动前动态注入配置(最可靠,推荐用于初始化依赖)
适用于从数据库、远程 API、环境变量等加载配置,并在 Spring 容器创建 Bean 前生效。此时 @Value 和 @ConfigurationProperties 尚未绑定,修改直接有效。
- 实现
ApplicationContextInitializer,在initialize()中获取ConfigurableEnvironment - 通过
environment.getPropertySources().addFirst(new MapPropertySource(...))插入高优先级配置源 - 注册方式:① 启动类中调用
springApplication.addInitializers(...);② 在META-INF/spring.factories中声明 - 注意:避免在初始化器中依赖已由 Spring 管理的 Bean(如
DataSource),可用原生 JDBC 或轻量工具查询
运行时热刷新配置(需配合 @RefreshScope)
适用于已启动服务中调整开关、阈值、日志级别等,但仅对加了 @RefreshScope 的 Bean 生效,且需手动触发刷新。
- 引入
spring-boot-starter-actuator和spring-cloud-starter - 开放端点:
management.endpoints.web.exposure.include=refresh - 在需要响应变更的类上标注
@RefreshScope(如@RestController、@Service) - 修改配置后执行
curl -X POST http://localhost:8080/actuator/refresh - 限制:不能新增配置项,只刷新已存在 key;集群中需逐个调用,无广播机制
用 EnvironmentPostProcessor 动态适配环境前缀
适合多环境共用一套配置结构,但 key 前缀需按 profile 切换(例如 db.test.url vs db.prod.url)。
- 实现
EnvironmentPostProcessor接口,在postProcessEnvironment()中读取当前 profile - 遍历
propertySources,将匹配旧前缀(如db.)的属性重写为带环境标识的新 key(如db.test.) - 在
META-INF/spring.factories中注册:org.springframework.boot.env.EnvironmentPostProcessor=xxx.DynamicConfigPostProcessor - 优势:无需改业务代码,纯配置层适配;缺点:无法覆盖已有同名 key,需确保原始配置未被提前加载
结合配置中心(Nacos / Apollo / Spring Cloud Config)
面向生产级多实例、需统一管控和审计的场景,提供界面化操作、版本回滚、灰度发布能力。
- Nacos 示例:引入
spring-cloud-starter-alibaba-nacos-config,配置spring.cloud.nacos.config.server-addr - 在
bootstrap.yml中指定配置集 ID 和 group,启动时自动拉取 - 配置变更后,客户端监听到事件,自动触发
@RefreshScopeBean 重建 - 比纯 Actuator 更健壮:支持集群广播、配置快照、历史版本对比、权限控制











