spring boot 無法獲取到@value 的值
問題
有時候需要在構造函數中完成一些初始化的操作,而這些操作同時也需要讀取一些配置文件中的值。
@Configuration
public class ConfigDemo {
@Value("${url}")
private String url;
public ConfigDemo (){
//此時url null
System.out.println(url);
}
}
原因
主要問題的原因就是,構造函數的執行順序先於類屬性的賦值。在構造函數中使用屬性的值且從application.yml通過@Value獲取,此時Spring容器還沒有向屬性賦值。這是Spring Bean的聲明週期的屬性造成的。
解決辦法
@Configuration
public class ConfigDemo implements InitializingBean {
@Value("${url}")
private String url;
public ConfigDemo (){
//此時url null
System.out.println(url);
//or do Other something
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println(url);
//or do Other init something
}
}
實現InitializingBean重寫方法,在屬性賦值後進行初始化的操作。將原來的由構造方法的初始化的操作提取到afterPropertiesSet中