You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot启动时ApplicationStartedEvent监听方法读取配置属性异常问题

问题核心错误
  • 第一处错误是ConfigProperty类的注解使用不当:你同时给类标注了@Configuration、@RefreshScope、@ConfigurationProperties,@Configuration会导致该Bean在Spring上下文初始化极早期就被实例化,这时候远程配置还没完成绑定,生成的是一个字段为默认值(boolean类型默认值为false)的实例。
  • 第二处错误是事件监听时机选错了:ApplicationStartedEvent的触发节点在Spring上下文刷新完成后、应用完全就绪前,而Spring Cloud体系下的远程配置(配置中心、Nacos、Apollo等)默认的拉取动作,尤其是@RefreshScope标记Bean的配置绑定,要么在更晚的ApplicationReadyEvent节点完成,要么是启动后异步拉取,这就导致你监听方法执行时,ConfigProperty还没拿到配置中心的flagOne=true值。

补充现象的原因:启动完成后手动调用接口时,距离应用启动已经过了一段时间,配置中心客户端已经完成远程配置拉取,触发了@RefreshScope代理Bean的刷新,这时候访问configProperty.flagOne拿到的就是刷新后的正确值,和启动时读到的默认值不是同一个刷新周期的实例。

调整方案

按以下步骤修改即可保证逻辑执行时能拿到正确配置:

  1. 先修正ConfigProperty类的错误注解
    去掉类上的@Configuration注解,@ConfigurationProperties只负责配置绑定,不需要标记为配置类,避免提前实例化。修正后代码如下:
@RefreshScope
@Getter
@Setter
@ConfigurationProperties(prefix = "flagconfig")
public class ConfigProperty {
    private boolean flagOne;

    @PostConstruct
    public void postConstruct() {
        logger.info("myPostConstruct: {}@{} {}",
                this.getClass().getSimpleName(), System.identityHashCode(this), this);
    }
}

如果是Spring Boot 2.2及以上版本,记得在启动类上添加@ConfigurationPropertiesScan指定配置类的扫描路径,保证ConfigProperty能被正确注册。

  1. 调整事件监听的时机,根据你用的配置中心类型选对应方案:
  • 如果配置中心已经配置为启动时同步拉取(即配置了拉取失败则应用启动失败的策略,比如Spring Cloud Config的spring.cloud.config.fail-fast=true),直接把监听的事件从ApplicationStartedEvent改成ApplicationReadyEvent即可,该事件在应用所有启动流程、同步加载任务全部完成后才会触发,此时已经能拿到绑定完成的配置值。
  • 如果你的配置中心默认是启动后异步拉取配置(比如默认配置下的Nacos、Apollo),ApplicationReadyEvent触发时也可能拿不到值,二选一调整即可:
    • 开启配置中心的启动预加载:比如Apollo开启apollo.bootstrap.eagerLoad.enabled=true,Nacos关闭启动异步拉取配置开关,把远程配置的加载时机提前到Spring环境准备阶段,保证所有Bean初始化前配置已经加载完成。
    • 直接监听配置刷新事件RefreshScopeRefreshedEvent,该事件会在每次@RefreshScope标记的Bean完成配置刷新后触发——不管是启动后第一次拉取到远程配置,还是后续运行时修改配置触发热刷新,都会执行你的业务逻辑,完全避免时机不对读不到值的问题。
  1. 额外优化建议:把你要执行的业务逻辑从Controller层抽离到单独的Service层,不要在事件监听逻辑里直接依赖Controller实例调用方法,避免因为Controller请求映射初始化时机问题引发不必要的异常。

内容的提问来源于stack exchange,提问作者hina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:39:20