知識庫 / Spring / Spring Boot RSS 訂閱

Spring Boot中使用 application.yml 還是 application.properties

Spring Boot
HongKong
9
12:46 PM · Dec 06 ,2025

1. 概述

在 Spring Boot 中,使用外部配置來定義我們的屬性是一種常見做法。這使得我們可以在不同的環境中同時使用相同的應用程序代碼。

我們可以使用屬性文件、YAML 文件、環境變量和命令行參數。

在本簡短教程中,我們將探討屬性文件和 YAML 文件之間的主要區別。

2. 屬性配置

默認情況下,Spring Boot 可以訪問在 application.properties 文件中設置的配置,該文件使用鍵值格式:

spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
spring.datasource.password=password

每一行都是一個單獨的配置,因此我們需要使用相同的前綴來表達層次數據,即使用相同的鍵前綴。在此示例中,所有鍵都屬於 spring.datasource

2.1. 屬性中的佔位符

在我們的值中,我們可以使用帶有 ${} 語法的佔位符來引用其他鍵、系統屬性或環境變量的內容:

app.name=MyApp
app.description=${app.name} is a Spring Boot application

2.2. 列表結構

如果具有相同類型的屬性但具有不同的值,我們可以使用數組索引來表示列表結構:

application.servers[0].ip=127.0.0.1
application.servers[0].path=/path1
application.servers[1].ip=127.0.0.2
application.servers[1].path=/path2
application.servers[2].ip=127.0.0.3
application.servers[2].path=/path3

2.3. 多環境配置

自 2.4.0 版本起,Spring Boot 支持創建多文檔屬性文件。 簡單來説,我們可以將單個物理文件分割成多個邏輯文檔。

這允許我們為每個需要聲明的環境定義文檔,所有文檔都位於同一個文件中:

logging.file.name=myapplication.log
bael.property=defaultValue
#---
spring.config.activate.on-profile=dev
spring.datasource.password=password
spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
bael.property=devValue
#---
spring.config.activate.on-profile=prod
spring.datasource.password=password
spring.datasource.url=jdbc:h2:prod
spring.datasource.username=prodUser
bael.property=prodValue

請注意,我們使用 ‘#&#45&#45&#45’ 符號來指示文檔分割的位置。

在本示例中,我們有兩個具有不同 配置文件Spring 部分。 此外,我們還可以擁有根級別的公共屬性集——在本例中,logging.file.name 屬性將在所有配置文件中保持一致。

2.4. 跨多文件 Profiles

作為一種替代方案,避免在同一個文件中擁有不同的 Profiles,我們可以將多個 Profiles 分佈在不同的文件中。在 2.4.0 版本之前,這是唯一可用的方法,用於 properties 文件。

我們通過在文件名中存儲 Profile 名稱來實現這一點,例如 application-dev.ymlapplication-dev.properties

3. YAML 配置

YAML (YAML Ain't Markup Language) 是一種人類可讀的數據序列化格式。它通常用於配置文件中,但也用於其他領域,例如數據交換和對象持久化。 YAML 的主要優勢在於其易讀性和簡潔性,這使得它成為配置管理和數據存儲的理想選擇。

以下是一些 YAML 配置的關鍵概念:

  • 鍵值對 (Key-Value Pairs): YAML 使用鍵值對來存儲數據。鍵和值之間用冒號 : 分隔。
  • 列表 (Lists): 列表用於存儲一系列的值。列表項使用縮進來表示,縮進級別表示列表的層級。
  • 嵌套 (Nesting): YAML 支持嵌套鍵值對和列表,這使得可以表示複雜的數據結構。

示例 YAML 配置:

# 這是一個示例 YAML 文件
name: My Application
version: 1.0
author:
  name: John Doe
  email: john.doe@example.com
dependencies:
  - library1
  - library2
  - library3

3.1. YAML 格式

除了 Java 的 properties 文件,我們還可以使用基於 YAML 的配置文件在我們的 Spring Boot 應用程序中使用。 YAML 是一種方便的格式,用於指定層次化的配置數據。

現在,讓我們從 properties 文件中的相同示例中轉換它到 YAML:

spring:
    datasource:
        password: password
        url: jdbc:h2:dev
        username: SA

這比其屬性文件替代方案更易讀,因為它不包含重複的前綴。

3.2. 列表結構

YAML 針對列表的表達提供更簡潔的格式:

application:
    servers:
    -   ip: '127.0.0.1'
        path: '/path1'
    -   ip: '127.0.0.2'
        path: '/path2'
    -   ip: '127.0.0.3'
        path: '/path3'

3.3. 多個配置文件

與屬性文件不同,YAML 默認支持多文檔文件,因此我們可以使用同一個文件存儲多個配置文件,無論使用哪個版本的 Spring Boot。

在這種情況下,規範表明需要使用 三個連字符來指示新文檔的開始

logging:
  file:
    name: myapplication.log
---
spring:
  config:
    activate:
      on-profile: staging
  datasource:
    password: 'password'
    url: jdbc:h2:staging
    username: SA
bael:
  property: stagingValue

注意:我們通常不希望在項目中同時包含標準 application.propertiesapplication.yml 文件,因為這可能會導致意外結果。

例如,如果我們將上述(在 application.yml 文件中)的屬性與第 2.3 節中描述的屬性組合起來,則 bael.property 將被分配為 defaultValue,而不是具有特定於配置文件的值。這僅僅是因為 application.properties 在稍後加載,從而覆蓋到該點為止的所有分配值。

4. Spring Boot 使用

現在我們已經定義了我們的配置,接下來讓我們看看如何訪問它們。

4.1. 註解

我們可以使用 @Value 註解注入我們屬性的值:

@Value("${key.something}")
private String injectedProperty;

此處,key.something 屬性通過字段注入的方式注入到我們的一個對象中。

4.2. 環境抽象

我們還可以使用 環境 API 獲取屬性的值:

@Autowired
private Environment env;

public String getSomeKey(){
    return env.getProperty("key.something");
}

4.3. 配置屬性註解

最後,我們還可以使用 @ConfigurationProperties 註解將我們的屬性綁定到類型安全且結構化的對象上:

@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
    String name;
    String description;
...

5. 結論

在本文中,我們瞭解到屬性和 Spring Boot 的 YAML 配置文件之間存在差異。我們還看到了它們的值可以引用其他屬性。最後,我們探討了如何將這些值注入到我們的運行時環境中。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.