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

Helidon MP中构造函数无法获取字段注入的ConfigProperty值问题

CDI字段注入的值为何在构造函数中无法访问?

在Helidon MP环境下,标记为@ApplicationScoped的GreetingProvider类中,若使用字段注入方式:

@Inject
@ConfigProperty(name = "app.greeting")
private String message;

@Inject //无论是否添加该注解,字段均为null
public GreetingProvider() {   
  LOG.debug("Message {}", message);
}

无论构造函数是否添加@Inject注解,在构造函数中访问message字段始终为null。但改用构造函数注入就能正常获取配置值:

@Inject
public GreetingProvider(@ConfigProperty(name = "app.greeting") String message) {   
    this.message = message;
}

同时,该字段能在标注@PostConstruct的方法或监听@Initialized(ApplicationScoped.class)事件的方法中正常访问。

原因解析

这是CDI(上下文和依赖注入)规范的实例初始化顺序决定的:

  • 第一步:创建实例:容器先调用构造函数创建Bean实例,此时所有字段还保持默认初始值(比如null)。
  • 第二步:字段注入:实例创建完成后,容器才会对标注@Inject的字段进行依赖注入。
  • 第三步:初始化回调:所有注入完成后,容器才会执行标注@PostConstruct的方法,或者触发@Initialized事件。

字段注入是在实例创建后才执行的,所以构造函数执行时,message还没被赋值,自然是null。而构造函数注入是把依赖作为参数直接传入构造函数,在创建实例的阶段就完成了值的传递,所以能正常获取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:52:03