原始碼基於SpringBoot 2.4.4
1、認識配置檔案
1.1 配置檔案的載入
建立SpringBoot專案的時候,會自動建立一個application.properties檔案,該檔案是SpringBoot預設的配置檔案。
SpringBoot在啟動的時候會預設去尋找並載入application.properties檔案和application.yaml檔案,在以下路徑中尋找:
(1)classpath目錄下
(2)classpath目錄下的config資料夾
(3)專案根目錄
(4)專案根目錄下config資料夾的子資料夾
(5)專案根目錄下config資料夾
優先順序從高到低,並且後載入的會覆蓋前面載入的。
1.2 配置檔案型別
(1)properties字尾:application.properties
(2)yaml字尾:application.yaml
1.3 兩種配置檔案比較
- 可以使用 @PropertySource 註解載入自定義的 Properties 配置檔案,但無法載入自定義的 YAML 檔案。
- YAML 支援列表的配置,而 Properties 不支援。
- 配置檔案載入順序:properties、xml、yml、yaml(後載入的會覆蓋前面載入的)
2、yaml配置檔案
2.1 介紹
YAML 是 "YAML Ain't Markup Language"(YAML 不是一種標記語言)的遞迴縮寫。在開發的這種語言時,YAML 的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)。
非常適合用來做以資料為中心的配置檔案
2.2 基本語法
(1)key: value。冒號與value之間必須有一個空格。
(2)大小寫敏感。
(3)使用縮排表示層級關係。
(4)縮排不允許使用tab,只能使用空格。
(5)縮排的空格數不重要,只要相同層級的元素左對齊即可。
(6)# 後面跟註釋內容
(7)字串無須加引號。""會進行轉義。比如'\n'就輸出\n,但"\n"則會輸出換行。
2.3 資料型別
(1)字面量:單個的、不可再分的值。date、boolean、string、number、null
k: v
(2)物件:鍵值對的集合。map、hash、set、object
# 行內寫法
k: {k1:v1,k2:v2,k3:v3}
# 或
k:
k1: v1
k2: v2
k3: v3
(3)陣列:一組按次序排列的值。array、list、queue
# 行內寫法
k: [v1,v2,v3]
# 或
k:
- v1
- v2
- v3
2.4 例項
定義兩個實體類Person
和Pet
,並且Person
類和配置檔案的屬性繫結
@Data
@ConfigurationProperties(prefix = "my-person")
@Component
public class Person {
private String userName;
private Boolean boss;
private Date birth;
private Integer age;
private Pet pet;
private String[] interests;
private List<String> animal;
private Map<String, Object> score;
private Set<Double> salarys;
private Map<String, List<Pet>> allPets;
}
@Data
public class Pet {
private String name;
private Double weight;
}
在yaml檔案中配置Person的屬性
my-person:
user-name: CodeTiger
boss: true
birth: 1996/11/29
# 可以使用random來生成各種不同型別的隨機值
age: ${random.int}
pet:
name: tomcat
weight: 100
interests: [basketball, football]
animal:
- jerry
- tom
score:
english:
first: 30
second: 40
third: 50
math: [131,140,148]
chinese: {first: 128, second: 136}
salarys: [3999,4999.98,5999.99]
allPets:
sick:
- {name: tom}
- {name: jerry,weight: 47}
health: [{name: mario,weight: 47}]
2.5 開啟自動提示
我們的類和配置檔案屬性繫結時,在配置檔案中設定屬性發現並沒有自動提示。在我們為類加上@ConfigurationProperties
註解的時候,idea就會提示我們配置Annotation Processor
根據文件,我們只需要在pom.xml
中增加相關的jar包即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
在打包的時候,我們不需要把它打入jar包,所以去除
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
3、使用yaml實現多環境配置
我們可以把多個環境的配置寫在一個檔案裡,可以使用符號---
進行分割,如下application.yaml檔案
spring:
profiles:
# 使用開發環境的配置
active: dev
---
# 開發環境配置
server:
port: 8888
spring:
profiles: dev
---
# 生產環境配置
server:
port: 8888
spring:
profiles: prod
也可以不同的開發環境寫在不同的配置檔案,比如在resources目錄下建立兩個配置檔案:application-dev.yml 和 application-prod.yml 此時,分別表示開發環境中的配置和生產環境中的配置。
然後在application.yaml檔案中指定使用哪個配置檔案即可。
我們還可以通過在程式碼中指定使用哪種環境的配置
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplicationBuilder builder = new SpringApplicationBuilder(TestApplication.class);
builder.application().setAdditionalProfiles("dev");
builder.run(args);
}
}
當然也可以在使用命令啟動jar包的時候指定
java -jar xxx.jar --spring.profiles.active=dev