SpringBoot 配置文件使用詳解

一、創建一個SpringBoot項目

創建 SprintBoot 項目的 2 種方式:

  1. //start.spring.io/ 上創建一個 SpringBoot 項目,然後導入到 IDEA 里。
  2. 直接在 IDEA 上創建 SpringBoot 項目, File->New->Project, Sprint Initializr,填上相關資訊。

我直接在 //start.spring.io/ 生成一個項目然後下載下來,導入 IDEA 里。

image-20220915223725068

把下載的文件解壓放在 SpringBootConfigDemos 文件夾下:

image-20220915223918315

二、配置文件類型

在上一小節的圖中可以看到,在 src/main/resources 目錄下的 application.properties 文件,這個就是創建的默認全局配置文件

這是一種文件類型,以 .properties 後綴結尾。

還有一種以 .yml 後綴結尾的 YAML 文件類型 – application.yml/application.yaml

YAML 是比 properties 格式更年輕,在雲原生里用的很多這種配置格式。

三、配置文件語法格式

3.1 application.properties 類型

properties 在 java 里屬於比較常見的配置文件類型,語法格式: key=valve 形式,

key=value

用法例子:

server.port = 80
server.ip = 127.0.0.1

app.property.key = proname
app.property.name = tom
app.list = 1,2,3

# 還有這樣語法
# 把啟動命令時加入: --spring.profiles.active=dev
spring.profiles.active = ${spring.profiles.active} # 讀取啟動命令參數

# 屬性佔位符:使用${var}語法引用已經定義的屬性的值
app.desc = your name is ${app.property.name} 

3.2 application.yml 類型

把上面 properties 格式改成 yml 格式:

server:
  port: 80
  ip: 127.0.0.1

  
app:
  property:
    key: proname
    name: tom
  list: [1,2,3]
  desc: your name is ${app.property.name}
    
spring:
  profiles:
     active: ${spring.profiles.active}

比如對於一個數組,可以這樣寫:

person:
  hobby:
    - 籃球
    - 跑步
    - 讀書

還可以這樣寫:

person:
  hobby: [籃球, 跑步, 讀書]

YAML 支援以下幾種數據類型:

  • 對象:鍵值對的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 數組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
  • 純量(scalars):單個的、不可再分的值

YAML 入門教程:

說明:YAML 格式是大小寫敏感的。key: value 表示鍵值對關係,冒號後面必須加一個空格

3.3 配置隨機值

SpringBoot 內部提供了一個 random.* 屬性,專門用於生成隨機值。

屬性 描述
random.int 隨機產生正負的整數
random.int(max) 隨機產生 [0, max) 區間的整數
random.int(min,max) 隨機產生 [min, max) 區間的整數
random.long 隨機產生正負的長整數
random.long(max) 隨機產生 [0, max) 區間的長整數
random.long(min,max) 隨機產生 [min, max) 區間的長整數
random.uuid 產生 UUID 字元串(含『-『字元)
random.* 『*』表示除上面列舉之外的其他字元,用於隨機產生 32 位字元串

配置例子:

int-val=${random.int}
int-range-val=${random.int(2)}
uuid-val=${random.uuid}

四、配置文件載入順序

SpringBoot 啟動時會載入以下位置的 application.properties 或者 application.yml 作為默認配置文件。

  1. file:./config/
  2. file:./config/*/
  3. file:./
  4. classpath:/config/
  5. classpath:/

載入順序依次從上到下,所有文件都會載入,高優先順序的內容會覆蓋低優先順序的內容。

五、其它形式配置

5.1 其它形式配置

其實上面已經有使用到,比如讀取命令行參數資訊到配置文件里。這裡的命令行參數也是一種動態配置資訊。

其它常用配置形式:

  1. 系統環境變數:在 linux 中經常用到這個。
  2. 命令行參數:啟動應用時常常會配置的運行參數。
  3. Java 系統屬性:通過 System.getProperties() 獲取的。
  4. 一些註解設置的屬性文件,比如 @PropertySource 設置的屬性文件
  5. 啟動類 SpringApplication.setDefaultProperties 設置的默認屬性

5.2 載入順序怎樣

  1. 命令行參數
  2. Java 系統屬性
  3. 系統環境變數
  4. 含有 random.* 值的屬性
  5. application-{profile}.{properties|yml}
  6. application.{properties|yml}
  7. 註解 @PropertySource 設置的屬性文件
  8. 啟動類 SpringApplication.setDefaultProperties 設置的默認屬性

載入順序依次從上到下。

六、配置資訊作用

  1. 資料庫連接資訊保存

  2. 項目的啟動資訊,比如 test,dev,prod 環境,埠資訊等

  3. 一些自定義配置資訊,比如文件上傳地址,調用第三方 url 地址、uid、密匙資訊等

等等。

七:讀取配置文件

7.0 綁定配置的一些規則

SpringBoot 對 *.properties*.yml 文件中配置的屬性名稱,它提供了一些綁定規則,它不要求配置的屬性名稱完全與 Bean 中的屬性名稱相同。它支援以下幾種規則的命名方式:

屬性 描述
firstName 標準的駝峰式命名
first-name 單詞之間通過『-『分隔,Spring Boot 推薦這種
first_name 單詞之間通過『_』分隔
FIRST_NAME 單詞全部大寫並通過『_』分隔,在使用系統環境變數時,推薦這種

7.1 通過 @Value 註解讀取

application.yml:

server:
  port: 80
  ip:   127.0.0.1

通過使用註解 @Value("${屬性名稱}") 來將配置文件裡面的值注入到程式屬性中。

@Component
public class ServerConfig {
    
    @Value("${server.port}")
    public String Port;
    
    @Value("${$server.ip}")
    public String IP;
}

7.2 通過 @ConfigurationProperties 註解讀取

7.2.1 @ConfigurationProperties 讀取配置值

@ConfigurationProperties:將配置文件中的相關配置和類裡面的屬性進行綁定。

它裡面有一個參數,當然這個參數也可以不填,語法如下:

@ConfigurationProperties(prefix = "xxx")

上面的 application.yml 里值也可以用如下程式來讀取:

@Component
@ConfigurationProperties(prefix = "server")
public class ServerConfig {
    
    public String port;
    
    public String ip;
}
  • 來一個比較複雜點例子:

application.yml 文件:

server:
  port: 80
  ip:   127.0.0.1
  list-server:
     - BJ-Server
     - GZ-Server
  map-server: {bj-server: 192.168.0.2, gz-server: 192.168.0.3}
  dns:
     bj: bj.dns.one
     gz: gz.dns.two
  arr-port: 8081, 8082

讀取配置文件:

@Component
@ConfigurationProperties(prefix = "server")
public class ServerConfig {
    
    public String port;
    public String ip;
    private List<String> listServer;
    private Map<String, String> mapServer;
    private int[] arrPort;
        
    private Dns dns;
        
    public static class Dns {
        private String bj;
        private String gz;
    }
}

上面的也可以用 @Value 讀取,程式跟前面例子一樣。

7.2.2 @Value 和 @ConfigurationProperties 區別

@ConfigurationProperties @Value
功能 批量注入配置文件中的屬性 一個個指定屬性
鬆散綁定 支援 不支援
SPEL(計算式) 不支援 支援
JSR303數據校驗 支援 不支援
複雜類型 支援 不支援

7.3 @PropertySource 載入指定配置文件

@PropertySource(“email-config.properties”),載入 email-config.properties 配置文件。

同理也可以載入 .yml 的文件。

email-config.properties:

email.name = jimmy
email.from = [email protected]
email.to = [email protected]

讀取配置文件值:

@Component
@PropertySource("email-config.properties")
@ConfigurationProperties(prefix = "email")
public class EmailConfig {
    private String name;
    private String to;
    private String from;
}

八、參考