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
相关产品推荐
相关产品推荐

