springboot 中yml配置


springboot 中各種配置項紀錄

0. 20210309 更新

@value 和 @ConfigurationProperties 綁定機制不一樣,@Value 配置在 yml 中時 list 無法根據 逗號 “,” 來分割數據,在 properties 文件里可以使用。

如果需要yml配置直接獲取,需要用到 spEL 表達式,如

/**
 * 注入列表形式(自動根據"|"分割)
 */
@Value("#{'${str1}'.split(',')}")
private List<String> str1;

更新:spring 5 之后,對於@value 在 yml 中,也可以完成list 按照 逗號分隔注入,無需額外的 SpEL 支持

1. @Value

最早獲取配置文件中的配置的時候,使用的就是這個注解,SpEL表達式語言。

// 使用起來很簡單
@Value("${config.demo.value:defaultValue}")
  private String simpleValue;
  

2. @ConfigurationProperties

通常我們配置的時候,不僅僅是一個單獨字段,可能是一組配置,用來組成一個對象。這個時候spring為我們提供了這個注解。

簡單的對象,在yml里也可以很簡單的寫出來。直接把每一個字段寫出即可。

而對復雜對象,如:list、map等的,就需要查一下資料了,這里簡單記錄一下寫法,直接看代碼。

# 配置示例
config:
  demo:
    value: testValue

    simpleConfig:
      config: testConfig

    str1: abc,cde
    str2:
      - abc
      - cde

    configMap:
      key1: value1
      海賊王: 路飛

    simpleConfigs:
      - config: 羅賓
        count: 1
      - config: 烏索普
        count: 1
      - config: 索隆
        count: 1

    configObjMap:
      key1:
        config: value1
      key2:
        config: value2

pojo 對象定義如下:

@Data
@ConfigurationProperties(prefix = "config.demo")
@Configuration
public class ConfigDemo {
  @Value("${config.demo.value:defaultValue}")
  private String simpleValue;

  /**===========簡單對象===========*/
  /**
   * 對象
   */
  private SimpleConfig simpleConfig;
  /**
   * 字符串數組1
   */
  private List<String> str1;
  /**
   * 字符串數組1
   */
  private List<String> str2;
  /**
   * 鍵值對
   */
  private Map<String, String> configMap;

  /**
   * ===========多個復雜對象==========
   */
  /**
  	* 對象集合
  	*/
  private List<SimpleConfig> simpleConfigs;
  /**
  * 對象作為map值
  */
  private Map<String, SimpleConfig> configObjMap;


  @Data
  public static class SimpleConfig {  // 注意:這里需要內部類是public的,要不然注入的時候會出錯。
    private String config;
    private int count;
  }
}

以上就是各種情況的書寫。其實也不難,list 就增加 - 來作為單個對象標識,而map就直接寫key即可。

而spring在存儲properties的時候是怎么處理的呢,我們可以斷點一下 PropertyPlaceholderHelper,在這里我們可以看到存儲各種配置的source如下圖:

底層都是通過一個ResourceReloadingMap來存儲的,那么存儲list的時候,是什么結構呢,如下:

// 存儲的時候是這樣的:

simpleConfigs[0].config=configValue
simpleConfigs[0].count=countValue
...

所以最終都是通過鍵值對的方式,只是對應的格式,spring可以解析成對應的樣子而已。

3. 參考

SpringBoot之Spring@Value屬性注入使用詳解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM