SpringBoot2配置檔案application.yaml

CodeTiger發表於2021-06-19

原始碼基於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資料夾

在這裡插入圖片描述

優先順序從高到低,並且後載入的會覆蓋前面載入的。

參考官方文件:https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config.files

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 例項

定義兩個實體類PersonPet,並且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

https://docs.spring.io/spring-boot/docs/2.4.4/reference/html/appendix-configuration-metadata.html#configuration-metadata-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.ymlapplication-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

相關文章