本文屬于原創(chuàng),轉(zhuǎn)載注明出處,歡迎關(guān)注微信小程序小白AI博客
微信公眾號(hào)小白AI
或者網(wǎng)站 https://xiaobaiai.net 或者我的CSDN http://blog.csdn.net/freeape
[TOC]
0 前言
進(jìn)入實(shí)際項(xiàng)目開發(fā)中,我們不僅僅是靠著默認(rèn)的全局配置文件application.properties
來配置我們的項(xiàng)目了事扭,Spring Boot中的配置文件也有不少需要注意的地方,掌握后,可以方便的讓我們在做項(xiàng)目中游刃于各種配置了焚鲜,讓配置一目了然,層次清楚放前,模塊清晰恃泪,寫成總結(jié),另外方便以后參考查閱犀斋。該文章的內(nèi)容是最新的配置文件介紹內(nèi)容贝乎,全部參考最新的官方文檔所寫,截至2019年11月21日叽粹,此時(shí)Spring是5.2.1
版本览效,Spring Boot是2.2.1
版本。
1 我們需要了解
Spring Boot
提供了一個(gè)spring-boot-devtools
jar包虫几,提供了一些方便程序開發(fā)的功能锤灿,主要是監(jiān)控程序的變化,然后進(jìn)行自動(dòng)重新啟動(dòng)辆脸。使用spring-boot-devtools
需要在pom.xml
中添加依賴項(xiàng)但校,同時(shí)需要設(shè)置<optional>true</optional>
。spring-boot-devtools
默認(rèn)將只在開發(fā)環(huán)境
生效啡氢,通過Spring Boot
插件打包時(shí)默認(rèn)是不會(huì)包含spring-boot-devtools
状囱。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
2 簡介和全局概述
創(chuàng)建一個(gè)Spring Boot
項(xiàng)目后,會(huì)在src/main/resources
目錄下默認(rèn)生成一個(gè)全局配置文件application.properties
倘是,不過里面啥內(nèi)容也沒有亭枷。Spring Boot已經(jīng)將所有默認(rèn)配置參數(shù)都自動(dòng)配置好了(https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html),如果我們在外部配置文件中修改配置搀崭,則默認(rèn)配置參數(shù)就會(huì)被修改(Externalized Configuration叨粘,配置外部化),配置外部化的方式有好幾種瘤睹,可以使用屬性文件(properties file)升敲、YAML文件、環(huán)境變量和命令行參數(shù)將配置外部化轰传,下面內(nèi)容會(huì)詳細(xì)介紹驴党。
比如配置文件可以是application.properties
或者是application.yml
,都可以配置绸吸,只是里面的配置語法不一樣而已鼻弧,yml格式層次相比properties格式要分明些设江。
.properties
寫法:
server.port = 9090
spring.application.name = demoservice
.yml
寫法:
spring:
application:
name: demoservice
server:
port: 9090
注意:yml格式中一定不要用制表符tab,冒號(hào)和值之間一定要有空格。
Spring Boot對參數(shù)的重寫(覆蓋)有一個(gè)順序攘轩,這是我們需要注意的叉存,這里概況如下:
- 當(dāng)使用了
Devtools
時(shí),$HOME/.config/spring-boot
文件夾中的Devtools全局設(shè)置屬性 -
@TestPropertySource
針對對測試的注解 - 測試的
properties
度帮。在@SpringBootTest
和測試注釋中提供歼捏,用于測試應(yīng)用程序的特定部分 - 命令行參數(shù)
- 來自
SPRING_APPLICATION_JSON
(內(nèi)嵌在環(huán)境變量或系統(tǒng)屬性中的JSON)的屬性 -
ServletConfig
初始化參數(shù) -
ServletContext
初始化參數(shù) - JNDI屬性:
java:comp/env
- Java系統(tǒng)屬性:
System.getProperties()
- 操作系統(tǒng)環(huán)境變量
-
RandomValuePropertySource
,其屬性僅在random.*
中 - 打包
jar之外
的特定于概要文件的應(yīng)用程序?qū)傩裕ㄈ?code>application-{profile}.properties和對應(yīng)的YAML變量) - 打包
在jar中
的特定于概要文件的應(yīng)用程序?qū)傩裕ㄈ?code>application-{profile}.properties和YAML變量) - 打包
jar之外
的應(yīng)用程序?qū)傩裕?code>application.properties和YAML變量) - 打包
在jar中
的應(yīng)用程序?qū)傩裕?code>application.properties和YAML變量) -
@Configuration
類上的@PropertySource
注解 - 默認(rèn)屬性(通過設(shè)置
SpringApplication.setDefaultProperties
指定)
舉一個(gè)具體的例子來說明上述的順序是如何生效的:
import org.springframework.stereotype.*;
import org.springframework.beans.factory.annotation.*;
@Component
public class MyBean {
@Value("${name}")
private String name;
// ...
}
比如在應(yīng)用程序類路徑(例如笨篷,打包在jar內(nèi)
)上瞳秽,可以有一個(gè)application.properties
文件,該文件為name
屬性設(shè)置了默認(rèn)屬性值率翅。在新環(huán)境中運(yùn)行時(shí)练俐,可以在jar外部
提供application.properties
文件,該文件覆蓋會(huì)覆蓋在jar內(nèi)
的application.properties
冕臭。又如對于一次性測試腺晾,可以使用特定的命令行開關(guān)啟動(dòng)(例如,java -jar app.jar --name="Spring"
)也可以覆蓋name
屬性值辜贵。又如可以JSON格式環(huán)境變量$ java -Dspring.application.json='{"name":"test"}' -jar myapp.jar
來覆蓋悯蝉。其他方式就不一一舉例了。
3 配置參數(shù)
3.1 參數(shù)設(shè)置及加載目錄的順序及作用優(yōu)先級(jí)
參數(shù)設(shè)置有兩種方式語法托慨,一個(gè)properties
鼻由,一個(gè)是yml
,SpringApplication
從application.properties
文件加載以下位置的屬性厚棵,并將它們添加到Spring環(huán)境
中蕉世。
- 當(dāng)前項(xiàng)目目錄的
config
子目錄 - 當(dāng)前項(xiàng)目根目錄
- classpath設(shè)定目錄下的
config
子目錄 - classpath設(shè)定目錄下
上述列表按優(yōu)先級(jí)排序(在列表中較高位置定義的屬性將覆蓋在較低位置定義的屬性,如1中設(shè)置的屬性值將覆蓋2中同屬性的屬性值)窟感。
注意:用maven構(gòu)建項(xiàng)目時(shí)讨彼,src/main/resources目錄就是默認(rèn)的classpath
另外這里說下yml的注意點(diǎn)和特殊用法歉井。
- yml格式中一定不要用制表符tab,冒號(hào)和值之間
一定要有空格
一定要有空格
一定要有空格
- yml的雙引號(hào)不會(huì)轉(zhuǎn)義字符串里面的特殊字符柿祈,特殊字符按本身功能輸出,比如
- yml的單引號(hào)會(huì)轉(zhuǎn)義字符串里面的特殊字符哩至,輸出原來的字符
# 下面會(huì)輸出得到hello換行xiaobaiai.net
name: "hello\nxiaobaiai.net"
# 下面會(huì)輸出得到hello\nxiaobaiai.net
name: 'hello\nxiaobaiai.net'
- yml支持對象躏嚎、數(shù)組、純量(字符串菩貌、布爾值true/false卢佣、整數(shù)、浮點(diǎn)數(shù)箭阶、null虚茶、時(shí)間戈鲁、日期
new Date('1976-07-31')
)
# 對象行內(nèi)寫法
students: { name: Steve, age: 22 }
# 數(shù)組行內(nèi)寫法
animal: [Cat, Dog]
# 或者數(shù)組非行內(nèi)寫法
animal:
- Cat
- Dog
3.2 生成配置參數(shù)隨機(jī)值
生成配置參數(shù)隨機(jī)值在測試或者某些場景下是非常有用的。
如我們配置:
#random int
app.location-x=${random.int}
app.location-y=${random.int}
#random int with max
app.user-age=${random.int(100)}
#random int range
app.max-users=${random.int[1,10000]}
#random long with max
app.refresh-rate-milli=${random.long(1000000)}
#random long range
app.initial-delay-milli=${random.long[100,90000000000000000]}
#random 32 bytes
app.user-password=${random.value}
#random uuid. Uses java.util.UUID.randomUUID()
app.instance-id=${random.uuid}
最后輸出:locationX=-449689812, locationY=-2048116572, userAge=88, maxUsers=8927, refreshRateMilli=418859, initialDelayMilli=12542150790115755, userPassword=95ea8b43fd16dc26aad0030c1340e723, instanceId=bd252902-54e9-47b3-bebf-a81b1300ff69
3.3 參數(shù)間引用(占位符)
在配置參數(shù)中可以通過占位符來實(shí)現(xiàn)引用之前定義的參數(shù)值嘹叫,如:
app.name=MyApp
app.description=${app.name} is a Spring Boot application
有些人喜歡(例如)使用--port=9000
而不是--server.port=9000
在命令行上設(shè)置配置屬性婆殿。可以通過在application.properties
中使用占位符
來啟用此行為:
server.port=${port:8080}
注意:如果繼承自
spring-boot-starter-parent
POM罩扇,則maven資源插件的默認(rèn)篩選標(biāo)記已從${*}
更改為@
(即婆芦,@maven.token@
而不是${maven.token}
),以防止與spring樣式占位符沖突喂饥。如果直接為application.properties
啟用了Maven篩選消约,則可能還需要將默認(rèn)篩選標(biāo)記更改為其他分隔符,而不是@
员帮。
3.4 自定義配置文件
3.4.1 方式一
如果不喜歡將application.properties
作為配置文件名或粮,可以通過指定spring.config.name
環(huán)境屬性切換到另一個(gè)文件名。還可以使用spring.config.location
環(huán)境屬性(目錄位置或文件路徑的逗號(hào)分隔列表)指定配置文件位置捞高。以下示例演示如何指定其他文件名:
$ java -jar myproject.jar --spring.config.name=myConfig
下面的示例演示如何指定兩個(gè)位置:
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
如果spring.config.location
包含目錄(而不是文件)被啼,則需要以/
結(jié)尾,并且棠枉,運(yùn)行的時(shí)候浓体,在加載配置之前,應(yīng)該附加從spring.config.name
配置的名稱或者默認(rèn)配置名稱辈讶。默認(rèn)不配置spring.config.location
則搜索配置文件順序?yàn)椋?/p>
file:./config/
file:./
classpath:/config/
classpath:/
使用時(shí)配置自定義配置位置時(shí)spring.config.location
命浴,它們會(huì)替換默認(rèn)位置。例如贱除,如果spring.config.location
配置了值classpath:/custom-config/,file:./custom-config/
生闲,則搜索順序?qū)⒆優(yōu)椋?/p>
file:./custom-config/
classpath:custom-config/
當(dāng)使用配置自定義配置位置時(shí)spring.config.additional-location
,除了額外配置路徑外月幌,還會(huì)使用默認(rèn)位置碍讯。在默認(rèn)位置之前搜索其他位置。
注意:在編程環(huán)境中扯躺,直接去application.properties中設(shè)置spring.config.name是無法生效的捉兴,只有在命令行或者設(shè)置環(huán)境變量
export SPRING_CONFIG_NAME=myConfig
,或則在代碼中去手動(dòng)編碼導(dǎo)入指定路徑中的配置文件录语。
3.4.2 方式二
直接通過編碼加載指定配置文件去實(shí)現(xiàn)倍啥,這種方式其實(shí)跟后面小節(jié)講到的自定義屬性是相通的,只多了一個(gè)指定文件名的注解澎埠,更詳細(xì)的可以看后面操作虽缕。比如我們創(chuàng)建test.properties
,路徑跟也放在src/main/resources
下面:
my.app.name=hello
my.app.func=test
然后新建一個(gè)參數(shù)Bean:
@Configuration
@ConfigurationProperties(prefix="my.app")
@PropertySource("classpath:test.properties")
public class ConfigTestBean {
private String name;
private String func;
// 省略getter和setter
}
這樣就Ok了蒲稳,怎么是驗(yàn)證可以看自定義配置參數(shù)小節(jié)氮趋。
3.5 命令行配置參數(shù)
默認(rèn)情況下伍派,SpringApplication
將任何命令行選項(xiàng)參數(shù)(即以--
開頭的參數(shù),例如--server.port=9000
)轉(zhuǎn)換為屬性剩胁,并將它們添加到Spring環(huán)境
中拙已。如前所述,命令行屬性順序排在第四摧冀,始終優(yōu)先于其下面屬性源倍踪。
如果不希望命令行屬性添加到Spring環(huán)境
中,可以在程序中使用SpringApplication.setAddCommandLineProperties(false)
禁用它們索昂。
3.6 特定于配置文件的屬性(激活profile)
除了application.properties
文件外建车,還可以使用以下命名約定定義特定于配置文件的屬性:application-{profile}.properties
。環(huán)境有一組默認(rèn)配置文件(默認(rèn)情況下profile為default椒惨,即application-default.properties)缤至,如果未設(shè)置活動(dòng)配置文件,則使用默認(rèn)的application-default.properties
文件康谆,加載順序和優(yōu)先級(jí)還是與application.properties
一樣的领斥。Spring
可使用Profile決定程序在不同環(huán)境下執(zhí)行情況,包含配置沃暗、加載Bean月洛、依賴等,Spring
的Profile一般項(xiàng)目包含:dev(開發(fā)), test(單元測試), qa(集成測試), prod(生產(chǎn)環(huán)境)孽锥。同樣地嚼黔,Maven也有Profile配置,可在構(gòu)建過程中針對不同的Profile環(huán)境執(zhí)行不同的操作惜辑,包含配置唬涧、依賴、行為等盛撑,每個(gè)Profile中可設(shè)置:id(唯一標(biāo)識(shí)), properties(配置屬性), activation(自動(dòng)觸發(fā)的邏輯條件), dependencies(依賴)等碎节。
說到這里,如何激活profile呢抵卫?下面介紹三種方式狮荔。
注意:application-{profile}.properties的重寫優(yōu)先級(jí)是要高于application.properties的,這個(gè)跟配置文件
加載順序
沒有關(guān)系陌僵。另外創(chuàng)建application-{profile}.yml文件跟properties是一樣的轴合。
3.6.1 方式一
在配置文件中設(shè)置,這種方式不靈活碗短,實(shí)際開發(fā)中不不太會(huì)用到
spring.profiles.active=test
3.6.2 方式二
使用占位符,在打包時(shí)替換题涨,以Maven為例
第一步在properties中添加(package.target是自定義的參數(shù)):
spring.profiles.active=@package.target@
第二步在pom.xml中增加不同環(huán)境打包的配置:
<!-- 與Maven build標(biāo)記并列 -->
<profiles>
<!-- 開發(fā)環(huán)境 -->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<package.target>dev</package.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</dependency>
</dependencies>
</profile>
<!-- 生產(chǎn)環(huán)境 -->
<profile>
<id>prod</id>
<properties>
<package.target>prod</package.target>
</properties>
</profile>
</profiles>
從上面的配置可以看出偎谁,Maven的Profile配置了兩個(gè):dev和prod总滩,并且在dev中使用了內(nèi)嵌Tomcat,而 prod 中沒有(這種配置場景如生產(chǎn)環(huán)境下使用外部Tomcat巡雨,開發(fā)時(shí)使用內(nèi)部Tomcat)闰渔。
第三步再添加資源過濾實(shí)現(xiàn)在構(gòu)建時(shí)修改以“@xxx@”表示的屬性,利用Maven的resources插件:
...
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<!-- Maven build標(biāo)記內(nèi) -->
<resources>
<!-- 不加該resource也可以 -->
<resource>
<directory>src/main/resources</directory>
<excludes>
<!-- 排除掉src/main/resources下的所有application*.properties文件 -->
<exclude>application*.properties</exclude>
</excludes>
</resource>
<resource>
<!-- 指定要處理的資源目錄 -->
<directory>src/main/resources</directory>
<!-- 是否替換@xx@表示的maven properties屬性值 -->
<filtering>true</filtering>
<includes>
<!-- 將文件內(nèi)容的“@xx@”替換為相應(yīng)的變量铐望,即package.target -->
<include>application-${package.target}.properties</include>
</includes>
</resource>
</resources>
第四步就是編譯打包了:
# 根據(jù)Maven Profile的 dev 構(gòu)建環(huán)境包
$ mvn clean package -Dmaven.test.skip=true -Pdev
3.6.3 方式三
通過設(shè)置系統(tǒng)環(huán)境變量:
export SPRING_PROFILES_ACTIVE=dev
3.6.4 其他方式
Java命令行設(shè)定方式:
# 方式一
$ java -jar app.jar --spring.profiles.active=dev
# 方式二
$ java -jar -Dspring.profiles.active=dev demo-0.0.1-SNAPSHOT.jar
注解方式(@ActiveProfiles
是Spring Boot的Test starter提供的注解冈涧,在單元測試中就比較有用了,只能在/src/test/java
中使用):
@ActiveProfiles("dev")
3.6.5 YML特殊方式
YAML文件實(shí)際上可以是由---
行分隔的一系列文檔正蛙,每個(gè)文檔被分別解析為一個(gè)展開的配置映射督弓。然后激活dev還是production的方式同樣的也有指定環(huán)境變量或者命令行方式之類的。
# 通用屬性
server:
port: 9000
---
# dev環(huán)境下配置
spring:
profiles: dev
server:
port: 9001
---
# production生產(chǎn)環(huán)境下配置
spring:
profiles: production
server:
port: 0
3.7 自定義屬性
Spring
已經(jīng)為我們提供很多的默認(rèn)參數(shù)乒验,不過我們也可以創(chuàng)建自己的配置參數(shù)愚隧。比如我們在application.properties
中創(chuàng)建下面的自定義屬性:
#random int
app.location-x=${random.int}
app.location-y=${random.int}
#random int with max
app.user-age=${random.int(100)}
#random int range
app.max-users=${random.int[1,10000]}
#random long with max
app.refresh-rate-milli=${random.long(1000000)}
#random long range
app.initial-delay-milli=${random.long[100,90000000000000000]}
#random 32 bytes
app.user-password=${random.value}
#random uuid. Uses java.util.UUID.randomUUID()
app.instance-id=${random.uuid}
然后創(chuàng)建對應(yīng)的Java參數(shù)組件MyAppProperties.java
:
@Component
@ConfigurationProperties("app")
public class MyAppProperties {
private int locationX;
private int locationY;
private int userAge;
private int maxUsers;
private long refreshRateMilli;
private long initialDelayMilli;
private String userPassword;
private UUID instanceId;
public int getLocationX() {
return locationX;
}
public void setLocationX(int locationX) {
this.locationX = locationX;
}
public int getLocationY() {
return locationY;
}
public void setLocationY(int locationY) {
this.locationY = locationY;
}
public int getUserAge() {
return userAge;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
public int getMaxUsers() {
return maxUsers;
}
public void setMaxUsers(int maxUsers) {
this.maxUsers = maxUsers;
}
public long getRefreshRateMilli() {
return refreshRateMilli;
}
public void setRefreshRateMilli(long refreshRateMilli) {
this.refreshRateMilli = refreshRateMilli;
}
public long getInitialDelayMilli() {
return initialDelayMilli;
}
public void setInitialDelayMilli(long initialDelayMilli) {
this.initialDelayMilli = initialDelayMilli;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public UUID getInstanceId() {
return instanceId;
}
public void setInstanceId(UUID instanceId) {
this.instanceId = instanceId;
}
@Override
public String toString() {
return "MyAppProperties [locationX=" + locationX + ", locationY=" + locationY + ", userAge=" + userAge
+ ", maxUsers=" + maxUsers + ", refreshRateMilli=" + refreshRateMilli + ", initialDelayMilli="
+ initialDelayMilli + ", userPassword=" + userPassword + ", instanceId=" + instanceId + "]";
}
}
@ConfigurationProperties
注解向Spring Boot
聲明該類中的所有屬性和配置文件中相關(guān)的配置進(jìn)行綁定。prefix = "app"
(prefix=可省略
) : 聲明配置前綴锻全,將該前綴下的所有屬性進(jìn)行映射狂塘。@Component
或者@Configuration
:將該組件加入Spring Boot
容器,只有這個(gè)組件是容器中的組件鳄厌,配置才生效荞胡。
提示:也可以通過
@Value("${key}")
讀取配置文件中的屬性,key = properties
文件等號(hào)左邊的key部分了嚎。在我們定義的 Java 參數(shù)組件中硝训,還可以對具體的參數(shù)進(jìn)行注解斷言,如@Email加到郵件的變量上新思,則如果注入的不是一個(gè)合法的郵件地址則會(huì)拋出異常窖梁。這類注解還有@AssertFalse
校驗(yàn)false、@AssertTrue
校驗(yàn)true夹囚、@DecimalMax(value=10,inclusive=true)
小于等于10纵刘,inclusive=true,是小于等于荸哟、@DecimalMin(value=,inclusive=)
假哎、@Max(value=)
小于等于value、@Min(value=)
大于等于value鞍历、@Past
檢查日期舵抹、@Pattern(regex=,flag=)
正則、@Validate
對po實(shí)體類進(jìn)行校驗(yàn)等劣砍。
最后還需要加入依賴spring-boot-configuration-processor
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 加入spring-boot-configuration-processor -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
校驗(yàn)我們自定義的配置:
@SpringBootApplication
public class Test07HelloworldApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Test07HelloworldApplication.class, args);
MyAppProperties bean = context.getBean(MyAppProperties.class);
System.out.println(bean.toString());
}
}
// output
// MyAppProperties [locationX=1329054364, locationY=1100464591, userAge=99, maxUsers=8007, refreshRateMilli=733281, initialDelayMilli=54489880705550952, userPassword=76aebd15270f7065adf3d31b5a790829, instanceId=681ed3a4-a561-460c-b826-58229c31b055]
4 總結(jié)
上述的內(nèi)容大部分經(jīng)過實(shí)際Demo驗(yàn)證惧蛹,示例代碼可以在https://github.com/yicm/SpringBootExamples上找到。配置文件這一章細(xì)節(jié)內(nèi)容比較多,但是我們把我?guī)讉€(gè)點(diǎn)就好了香嗓,這個(gè)總結(jié)下:
- Spring Boot為我們提供了大量的默認(rèn)配置迅腔,我們可以重寫這些配置參數(shù)的值,并提供了多種方式去重寫(覆蓋)靠娱,且重寫方式之間是有優(yōu)先級(jí)的
- Spring Boot應(yīng)用可以在不同的位置加載配置文件
application.properties(yml)
沧烈,并且這些位置是有順序、優(yōu)先級(jí)的 - Spring Boot的參數(shù)之間可以通過占位符引用像云,而且還可以通過占位符實(shí)現(xiàn)命令行參數(shù)名字的簡化
- Spring Boot可以支持自定義參數(shù)
- Spring Boot可以支持自定義配置文件名
- Spring Boot可以支持多配置文件的切換锌雀,通過
application-{profile}.properties(yml)
激活profile,且有多種方式去激活profile
如果你知道了上述總結(jié)的具體內(nèi)容迅诬,那么這一博文你也差不多都了解了腋逆。
5 參考資料
- https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html
- https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-yaml
- https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config
- https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/api//org/springframework/boot/SpringApplication.html
- https://docs.spring.io/spring/docs/5.2.1.RELEASE/javadoc-api/org/springframework/test/context/TestPropertySource.html
- https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-testing-spring-boot-applications-testing-autoconfigured-tests
- http://www.ruanyifeng.com/blog/2016/07/yaml.html
- https://yaml.org/spec/1.2/spec.html
- https://segmentfault.com/a/1190000011770028
本文屬于原創(chuàng),轉(zhuǎn)載注明出處百框,歡迎關(guān)注CSDNfreeape或微信小程序小白AI博客
微信公眾號(hào)小白AI
或者網(wǎng)站 https://xiaobaiai.net