Springboot yml如何獲取系統環境變量的值

yml獲取系統環境變量的值

註意,這裡說的是獲取系統環境變量的值,譬如Windows裡配置的JAVA_HOME之類的,可以直接在Springboot的配置文件中獲取。

我們經常使用一些docker管理平臺,如DaoCloud、rancher之類的,裡面都可以配置環境變量,目的當然也就是供程序獲取。使用環境變量的話,可以避免在application.yml裡直接明文編寫數據庫密碼、appkey之類的。

用法很簡單

譬如我系統環境變量裡,配置的有M2_HOME

那麼就可以在application.yml使用如下

maven:
  path: ${M2_HOME}

然後在代碼裡就能根據maven.path取到環境變量配置的值瞭。

當然還有一些高級用法,譬如你忘瞭配置環境變量瞭,上面的寫法就取不到值瞭,可以使用

maven:
  path: ${M2_HOME:abc}

使用冒號分隔,當環境變量中M2_HOME為空時,就會使用abc來填充瞭。

通過上面的方式,就可以做到不明文編碼一些敏感密碼之類的,隻配置在環境變量裡,就能避免所有開發人員看到瞭。 

另外加一個小的其他知識,就是如何給static屬性賦初值,之前都知道@Value是可以給普通變量賦值的,那麼static的需要用下面的方式。

@Component
public class StaticProperties { 
    public static String CUSTOM_NAME; 
    @Value("${custom.name}")
    public void setCustomName(String customName) {
        CUSTOM_NAME = customName;
    } 
}

讀取環境變量和配置信息的方法

核心的配置文件讀取方式

核心配置文件是指在resources根目錄下的application.properties或application.yml配置文件,讀取這兩個配置文件的方法有兩種,都比較簡單。

例如,我的application.properties文件中有如下內容:

local.ip=127.0.0.1
local.port=8080

使用Environment方式

@Component
public class UserConfig {
    @Autowired
    private Environment env;
    public void show(){
        System.out.println("local.ip="+env.getProperty("local.ip"));
    }
}

使用@Value方式(常用)

@Component
public class UserConfig {
    @Value("${local.port}")
    private String localPort;
    public void show(){
        System.out.println("localPort="+localPort);
    }
}

自定義文件的讀取

有時候,因項目的需要,需要自定義配置文件來存放一些自定義的信息(盡量不破壞核心文件的原生態),比如,我們在

在resources/config目錄下創建配置文件hk.properties

resources/config/hk.properties內容如下:

name=hk
sex=1

創建管理配置的實體類:

@Component
@PropertySource(value = "classpath:config/hk.properties")
public class HKConfig {
    @Value("${name}")
    private String name;
    @Value("${sex}")
    private String sex;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
}

yml的配置文件

對於像如下結構的內容:

jdbc:
    name:hk
    password:123

對於這類,獲取方式和上面一樣,jdbc.name即可。

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

推薦閱讀: