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

Spring Boot中从application.yml加载配置后Bean注入为空问题排查

Spring Boot中@Autowired注入的Properties对象在构造方法中为null?

先理清楚你的场景:

你的application.yml配置:

statsd: host: 10.0.5.23 port: 8125

定义的StatsdProperties类:

@Component
@ConfigurationProperties(prefix="statsd")
public class StatsdProperties {
    private String host;
    private int port;
    
    // 省略getters & setters
}

出问题的MyClass:

@Component
public class MyClass {
    @Autowired
    private StatsdProperties statsdProperties;

    public MyClass() {
        // 这里调用statsdProperties.getPort()时发现对象是null
        System.out.println(statsdProperties.getPort());
    }
}

问题到底出在哪?

最核心的原因是Spring的依赖注入时机晚于构造方法执行:

Spring创建MyClass实例时,会先调用无参构造方法把对象初始化出来,这时候@Autowired标注的statsdProperties字段还没被Spring赋值,所以你在构造方法里调用它的方法自然会碰到null。

另外还有两个需要排查的小问题:

  1. 你的YAML格式不对:YAML对缩进要求很严,你现在把statsd的两个配置写在同一行,Spring根本没法正确解析。正确的写法应该是:
    statsd:
      host: 10.0.5.23
      port: 8125
    
  2. 配置绑定可能没生效:虽然你给StatsdProperties加了@Component,但如果这个类不在Spring的组件扫描范围内,或者没通过@EnableConfigurationProperties显式启用,也可能导致Bean创建失败(不过这种情况一般启动时就会报错,不太会出现注入null的情况)。

怎么解决?

有两种靠谱的修复方式,选一种就行:

方案1:用构造方法注入(Spring官方推荐)

直接把依赖通过构造方法传进去,这样在创建MyClass对象的时候,statsdProperties就已经被注入了,完全不会有null的问题:

@Component
public class MyClass {
    private final StatsdProperties statsdProperties;

    // 构造方法注入依赖
    public MyClass(StatsdProperties statsdProperties) {
        this.statsdProperties = statsdProperties;
        // 现在可以放心调用方法了
        System.out.println(statsdProperties.getPort());
    }
}

方案2:用@PostConstruct注解初始化

如果你习惯用字段注入,那就把需要调用依赖的逻辑放到@PostConstruct标注的方法里——这个方法会在Spring完成所有依赖注入之后才执行,这时候statsdProperties已经被赋值了:

@Component
public class MyClass {
    @Autowired
    private StatsdProperties statsdProperties;

    public MyClass() {
        // 构造方法里别碰依赖对象
    }

    @PostConstruct
    public void init() {
        // 这里可以安全调用statsdProperties的方法
        System.out.println(statsdProperties.getPort());
    }
}

最后记得把application.yml的格式改对,不然就算注入成功,配置值也会是默认值哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:00:00