【SpringBoot】YAML 配置檔案

準Java全棧開發工程師 發表於 2022-06-21
Spring

👉 部落格主頁:準Java全棧開發工程師
👉 00年出生,即將進入職場闖蕩,目標賺錢,可能會有人覺得我格局小、覺得俗,但不得不承認這個世界已經不再是以一條線來分割的平面,而是圍繞財富旋轉的球面,成為有錢人不是為了去掌控球體的轉向,而是當有人惡意掌控時,努力保護好家人和自己。

一、YAML 簡介

1、什麼是 YAML ?

  • YAML(YAML Ain't Markup Language),一種資料序列化格式。
  • 這種格式的配置檔案近些年逐漸進入市場,並開始佔據主導地位。

2、優點

  • 較 xml 型別和 properties 型別相比,更容易閱讀,結構也更加的清晰。
  • 容易與指令碼語言互動。
  • 以資料為核心,重資料輕格式,輕格式並不是說可以不遵守格式,只是格式更加隨性一些。

3、副檔名

  • 副檔名有兩種,無論是那個副檔名,都是 YAML 格式的配置檔案,擁有 YAML 的屬性。
    • .yml ,這種副檔名更加主流一些
    • .yaml

4、語法規則

  • 對大小寫非常敏感,如:定義 age 和 AGE 都會認為是兩個屬性。
  • 屬性層級關係使用多行描述,每行結尾使用冒號結束。
  • 使用縮排表示層級關係,同層級左側對齊,只允許使用空格。
  • 空格個數並不重要,只要保證同層級的左側對齊即可。
  • 屬性值前面新增空格。
  • 號表示註釋。

5、格式

server:
  port: 80
  • 切記:屬性值前面必須有一個空格。
  • port 是 server 下的一個屬性,根據屬性層級之間使用多行描述,以及使用縮排表示的規則,port 的書寫位置如上所示,但一般情況下,這種格式我們無需過多糾結,我們回車換行後自動提供的格式一般都是正確的。

6、陣列資料

name: 準Java全棧開發工程師
server:
  port: 80
# 陣列格式
likes:
  - game
  - movie
  - music
  • 陣列資料的屬性值換行書寫,以 “-” 減號開頭,注意屬性值前空格,如上述 likes 所示。

二、三種配置檔案

以配置埠號為例,介紹三種配置檔案及其格式。

1、properties 型別

  • 在未接觸到 yaml 之前,我們的配置檔案大多數都是以 properties 結尾的檔案。
server.port=80
  • 格式為:屬性名=屬性值 。
  • 這種方式還是非常常見的,我們之前在配置連線資料庫相關資訊的 jdbc.properties 檔案也是使用的該方式。

2、yml 型別

server:
  port: 81
  • 將埠號設定為 81 。

3、yaml 型別

  • yml 和 yaml 只是副檔名不同而已,其實是一種型別的配置檔案。
server:
  port: 82

4、優先順序

  • 當專案中同時存在上述三個配置檔案時,用採用那個配置檔案呢?我們可以通過觀察埠號來獲得優先順序順序。
    在這裡插入圖片描述
  • 埠號為 80 ,說明優先採用了 properties 型別的配置檔案,它的優先順序最高。
  • 將 properties 配置檔案中的配置內容刪除,觀察 .yaml 和 .yml 那種檔案優先順序更高。
    在這裡插入圖片描述
  • 埠號又變為了 81 ,說明 .yml 檔案優先順序更高一些,雖然 .yaml 只是不同的副檔名罷了。
  • 總結:優先順序由高到低 properties > yml > yaml

三、YAML 程式碼提示功能

  • 有很多小夥伴反應,說在寫 YAML 檔案時,程式碼不提示。
    在這裡插入圖片描述
  • 沒有程式碼提示功能,對我們開發還是造成了一定的影響的,下面就帶著大家來解決這個問題。
  • 首先進入到模組管理。
    在這裡插入圖片描述
  • 將 YAML 型別的兩個配置檔案新增。

在這裡插入圖片描述

  • 選中建立的兩個配置檔案,完成後點選 “OK” 即可。

在這裡插入圖片描述

  • 此時的配置檔案已經變成了三個。

在這裡插入圖片描述

  • 重新回到配置檔案看是否實現了程式碼提示功能。

在這裡插入圖片描述

  • 已經實現了程式碼提示功能,雖然是 YAML 檔案,但是程式碼提示的還是按照 properties 型別進行的,並不影響,找到需要的屬性直接回車後還是會呈現出 YAML 格式。
    在這裡插入圖片描述

四、讀取 YAML 配置檔案中的資料

1、資料準備

sourceName: SpringBoot

server:
  port: 80

user:
  name: 準Java全棧開發工程師
  age: 22
  likes:
    - music
    - game
    - movie

2、方式一:@Value

@SpringBootTest
class DemoApplicationTests {

    @Value("${sourceName}")
    private String sourceName;
    @Value("${server.port}")
    private Integer port;
    @Value("${user.likes[0]}")
    private String likes;

    @Test
    void contextLoads() {
        System.out.println(sourceName);
        System.out.println(port);
        System.out.println(likes);
    }
}
  • 將要讀取的資料定義為屬性,使用 @Value 註解讀取配置檔案中的資料並注入給屬性,之後在方法體中可以直接使用。

3、方式二:Environment

@SpringBootTest
class DemoApplicationTests {
    @Autowired
    private Environment environment;

    @Test
    void contextLoads() {
        System.out.println(environment.getProperty("sourceName"));
        System.out.println(environment.getProperty("server.port"));
        System.out.println(environment.getProperty("user.likes[0]"));
    }
}
  • SpringBoot 提供有 Environment 物件,可以將配置檔案中的所有資料都封裝到該物件中,使用 getProperty 方法,將想要讀取的資料名作為引數傳入即可。

4、方式三:自定義物件

user:
  name: 準Java全棧開發工程師
  age: 22
  likes:
    - music
    - game
    - movie
  • 對於配置類中的 user 資料,其下還有很多子層,如果我們想一下子將 user 的所有資料都取出,應該怎麼做呢?將其封裝為一個物件。
@Component  // 將bean的建立工作交由Spring管理
// @ConfigurationProperties 註解表示載入配置檔案
// 使用prefix字首表示只載入指定字首的資料
@ConfigurationProperties(prefix = "user")
public class User {
    private String name;
    private Integer age;
    private Object[] likes;
	// get、set、toString和構造器方法省略
}
  • 和我們定義實體類沒有太大的區別,只是這次不再是和資料庫表中的欄位對應,而是和配置檔案中定義的資料對應。
  • 除此之外,還需要使用 ConfigurationProperties 註解載入配置檔案,使用 prefix 指定載入資料的字首。
@SpringBootTest
class DemoApplicationTests {
    @Autowired
    private User user;

    @Test
    void contextLoads() {
        System.out.println(user);
    }
}
  • 使用該方式在定義實體類時,會報紅提示

在這裡插入圖片描述

  • 我們只需要在 pom.xml 檔案中匯入相應的依賴即可。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

👉 以上就是文章的全部內容啦,諸佬如果有任何建議都可以提哦。
👉 創作不易,如果覺得對您有幫助的話,歡迎關注✨點贊👍收藏📂哦。