知識改變命運(yùn),擼碼使我快樂妇汗,2020繼續(xù)游走在開源界
點(diǎn)贊再看际歼,養(yǎng)成習(xí)慣
給我來個Star吧,點(diǎn)擊了解下基于SpringBoot的組件化接口服務(wù)落地解決方案
SpringBoot
提供了內(nèi)部配置application.yml
文件的方式來進(jìn)行全局配置得运,還支持使用profiles
來激活不同環(huán)境下使用不同的配置文件膝蜈,而這種方式畢竟是已經(jīng)打包完成了,因此存在一定的局限性熔掺,像數(shù)據(jù)庫特殊敏感配置也可能存在泄露的風(fēng)險饱搏,如何解決這種問題呢?我們來看看本章要講到的外部配置的方式吧V寐摺M品小!
推薦閱讀
前言
SpringBoot
提供了多種的外部化配置方式券坞,主要是為了方便在不同的環(huán)境中運(yùn)行相同的代碼鬓催。
我們可以通過Properties文件
、YAML文件
恨锚、環(huán)境變量
宇驾、命令行參數(shù)
等來配置,獲取配置的值時可以通過@Value
注解進(jìn)行注入猴伶,也可以使用@ConfigurationProperties
注解進(jìn)行層級結(jié)構(gòu)化綁定到實(shí)體類的字段中课舍。
加載順序
SpringBoot
配置參數(shù)存在一定的順序,當(dāng)然對相同名稱的屬性配置他挎,會因?yàn)榧虞d的優(yōu)先級存在覆蓋筝尾,順序如下所示:
-
DevTools
全局設(shè)置屬性 -
@TestPropertySource
注解 -
properties
測試中的屬性 - 命令行參數(shù)
-
SPRING_APPLICATION_JSON
屬性配置(嵌入在環(huán)境變量或者系統(tǒng)屬性中的嵌入式JSON字符串) -
ServletConfig
初始化參數(shù) -
ServletContext
初始化參數(shù) -
JNDI
屬性java:comp/env
- Java系統(tǒng)屬性
- 操作系統(tǒng)環(huán)境變量
- 打包在jar內(nèi)的配置文件(
application.properties
和YAML
文件) -
@PropertySource
注解 - 默認(rèn)屬性(通過
SpringApplication.setDefaultProperties
設(shè)置)
配置示例
我們從上面挑選幾種來進(jìn)行測試下配置輸出,首先創(chuàng)建一個名為LoadConfig
的配置類雇盖,內(nèi)容如下所示:
/**
* 加載配置類
*
* @author 恒宇少年
*/
@Configuration
public class LoadConfig {
/**
* 配置讀取name屬性忿等,不存在時使用空字符為默認(rèn)值
*/
@Value("${name:''}")
private String name;
public String getName() {
return name;
}
}
在LoadConfig
配置類中栖忠,我們添加了一個name
字段崔挖,由于該字段使用了@Value
注解贸街,所以它的值會從配置環(huán)境中加載名為name
的屬性值(配置的方式并沒有限制)。
為了方便演示狸相,我們在應(yīng)用程序啟動時通過實(shí)現(xiàn)CommandLineRunner
接口在啟動成功后輸出name
的值薛匪,SpringBootApplication
入口類代碼如下所示:
/**
* 啟動類入口
*/
@SpringBootApplication
public class SpringBootBasicExternalizedConfigurationApplication implements CommandLineRunner {
/**
* 注入配置類{@link LoadConfig}
*/
@Autowired
private LoadConfig loadConfig;
public static void main(String[] args) {
SpringApplication.run(SpringBootBasicExternalizedConfigurationApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println("name config value:" + loadConfig.getName());
}
}
YAML文件配置
這種我們在開發(fā)應(yīng)用程序中最常用的方式,只需要在src/main/resources
目錄下創(chuàng)建一個名為application.yml
的配置文件脓鹃,然后在該文件內(nèi)添加對應(yīng)屬性名稱的配置逸尖,如下所示:
# 配置name屬性
name:
default
我們?nèi)绻苯訂討?yīng)用程序,會在控制臺輸出name
的值為default
瘸右。
注意事項(xiàng):
application.yml
與application.properties
作用娇跟、優(yōu)先級相同,只是配置的展現(xiàn)形式不一樣而已太颤,我個人更喜歡YAML
文件的形式苞俘,層級分明,閱讀性高一些龄章。
命令行環(huán)境變量配置
在執(zhí)行java -jar
啟動應(yīng)用程序時吃谣,可以通過添加SPRING_APPLICATION_JSON
配置來進(jìn)行自定義屬性配置,該配置是一個JSON
字符串的形式做裙,使用方式如下所示:
SPRING_APPLICATION_JSON='{"name":"system_env"}' java -jar spring-boot-basic-externalized-configuration-0.0.1-SNAPSHOT.jar
運(yùn)行結(jié)果:這種方式啟用應(yīng)用程序時岗憋,會在控制臺輸出
name
的值為system_env
。
命令行參數(shù)配置
命令行參數(shù)這種方式也比較常用锚贱,通過--
進(jìn)行配置仔戈,比較常見的命令--spring.profiles.active
,啟動時用于修改激活的profile
拧廊,而我們?nèi)绻胍薷?code>name屬性配置的值杂穷,如下所示:
java -jar spring-boot-basic-externalized-configuration-0.0.1-SNAPSHOT.jar --name=hengboy
或者使用--spring.application.json
方式也可以配置,如下所示:
java -jar spring-boot-basic-externalized-configuration-0.0.1-SNAPSHOT.jar --spring.application.json='{"name":"hengboy"}'
運(yùn)行結(jié)果:以上兩種方式都可以卦绣,控制臺都會輸出
name
的值為hengboy
耐量。
Java系統(tǒng)屬性配置
Java
系統(tǒng)屬性的方式進(jìn)行配置時,不僅使用@Value
可以獲取到屬性值滤港,使用java.lang.System#getProperty(java.lang.String)
方法也是可以獲取到的廊蜒,通過-D
進(jìn)行配置,如下所示:
java -Dname=JavaSystemConfig -jar spring-boot-basic-externalized-configuration-0.0.1-SNAPSHOT.jar
或者使用-Dspring.application.json
方式配置(這種方式使用System.getProperty
方法無法獲取到屬性值)溅漾,如下所示:
java -Dspring.application.json='{"name":"JavaSystemConfig"}' -jar spring-boot-basic-externalized-configuration-0.0.1-SNAPSHOT.jar
運(yùn)行結(jié)果:以上兩種方式啟動應(yīng)用程序山叮,控制臺會輸出
name
的值為JavaSystemConfig
。注意事項(xiàng):Java屬性配置必須在
-jar xxx.jar
之前添履,配置在后面無法讀取到屬性值屁倔。
總結(jié)
多樣化的配置屬性的方式,使SpringBoot
變的是那么的靈活暮胧,如果有興趣可以把上面全部的配置方式都嘗試一遍锐借,你會有意想不到的收獲的问麸。
代碼示例
如果您喜歡本篇文章請為源碼倉庫點(diǎn)個Star
,謝謝3琛Q下簟!
本篇文章示例源碼可以通過以下途徑獲取布轿,源碼分支為2.x
哮笆,目錄為spring-boot-basic-externalized-configuration
: