SpringBoot 組態檔使用詳解

2022-09-16 21:00:21

一、建立一個SpringBoot專案

建立 SprintBoot 專案的 2 種方式:

  1. https://start.spring.io/ 上建立一個 SpringBoot 專案,然後匯入到 IDEA 裡。
  2. 直接在 IDEA 上建立 SpringBoot 專案, File->New->Project, Sprint Initializr,填上相關資訊。

我直接在 https://start.spring.io/ 生成一個專案然後下載下來,匯入 IDEA 裡。

把下載的檔案解壓放在 SpringBootConfigDemos 資料夾下:

二、組態檔型別

在上一小節的圖中可以看到,在 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;
}

八、參考