Springboot如何通過yml配置文件為靜態成員變量賦值

通過yml配置文件為靜態成員變量賦值

我們對springboot為普通成員變量的方式很熟悉,所以經常定式思維的認為靜態屬性的賦值和普通屬性一樣,結果調試的時候調試半天發現靜態屬性還是Null。

仔細一想才發現靜態屬性和普通屬性的賦值方式不太一樣。

到底是哪裡不一樣呢?問題出在set方法。我們通過idea快捷鍵或註解 @Data 得到的set方法是靜態方法。

這裡我強調一句

  • 用idea快捷鍵或註解 @Data 得到的set方法是靜態方法
  • 用idea快捷鍵或註解 @Data 得到的set方法是靜態方法
  • 用idea快捷鍵或註解 @Data 得到的set方法是靜態方法

而springboot為屬性賦值時采用的是動態的setter註入,所以我們按照為普通屬性賦值的方法給靜態變量賦值必然是行不通的。

所以我們隻需要將圖裡面的 static 給刪掉就大功告成瞭!!

順便再提一句,在這個類上面需要加上 @ConfigurationProperties(prefix = "reggie.qiniu") 註解,並且在調用的地方加上 @EnableConfigurationProperties(QiniuUtils.class) 註解,括號裡面的參數不可以跟我一樣哦,如果多處都需要調用的話,你嫌麻煩可以直接在springboot啟動類上加上這個註解。

怕有的同學還是看不懂,我再貼一下我yml配置文件裡面配置的寫法。

Springboot靜態變量讀取yml配置信息

因為spring加載靜態方法比IOC早,所以不能直接使用@Value註解讀取yml配置,讀取結果往往是null。

解決方式1

我們可以通過@PostConstruct在服務加載Servlet的時候運行

@Configuration
public class DemoConfig {

    //給靜態變量賦值
    @Value("${mvc.test}")
    public  int test;
    public void setTest(int test) {
        this.test = test;
    }
    
    

    public static   int TEST;
    @PostConstruct
    public  void init(){
        DemoConfig.TEST = test;
    }

}

然後在我們需要的地方調用就行瞭

@Component
public class MyConfig {
    public  void show(){
        System.out.println(DemoConfig.TEST);
    }
}

解決方式2

我們可以通過@AutoConfigureAfter 來在當前類註入到容器之前去加載相關配置類

@Configuration
public class DemoConfig {
    public static int test;
    //給靜態變量賦值
    @Value("${mvc.test}")
    public void setTest(int test) {
        DemoConfig.test = test;
    }
}
@AutoConfigureAfter({DemoConfig.class})  //加載當前文件之前先去加載DemoConfig文件
@Component
public class MyConfig {
    public  void show(){
        //然後在我們需要的地方調用就行瞭
        System.out.println(DemoConfig.test);
    }

}

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: