建立 SprintBoot 專案的 2 種方式:
我直接在 https://start.spring.io/ 生成一個專案然後下載下來,匯入 IDEA 裡。
把下載的檔案解壓放在 SpringBootConfigDemos 資料夾下:
在上一小節的圖中可以看到,在 src/main/resources 目錄下的 application.properties
檔案,這個就是建立的預設全域性組態檔。
這是一種檔案型別,以
.properties
字尾結尾。
還有一種以
.yml
字尾結尾的 YAML 檔案型別 -application.yml/application.yaml
。
YAML 是比 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}
把上面 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 表示鍵值對關係,冒號後面必須加一個空格。
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
作為預設組態檔。
載入順序依次從上到下,所有檔案都會載入,高優先順序的內容會覆蓋低優先順序的內容。
其實上面已經有使用到,比如讀取命令列引數資訊到組態檔裡。這裡的命令列引數也是一種動態設定資訊。
其它常用設定形式:
- 系統環境變數:在 linux 中經常用到這個。
- 命令列引數:啟動應用時常常會設定的執行引數。
- Java 系統屬性:通過 System.getProperties() 獲取的。
- 一些註解設定的屬性檔案,比如 @PropertySource 設定的屬性檔案
- 啟動類 SpringApplication.setDefaultProperties 設定的預設屬性
- 命令列引數
- Java 系統屬性
- 系統環境變數
- 含有 random.* 值的屬性
- application-{profile}.{properties|yml}
- application.{properties|yml}
- 註解 @PropertySource 設定的屬性檔案
- 啟動類 SpringApplication.setDefaultProperties 設定的預設屬性
載入順序依次從上到下。
資料庫連線資訊儲存
專案的啟動資訊,比如 test,dev,prod 環境,埠資訊等
一些自定義設定資訊,比如檔案上傳地址,呼叫第三方 url 地址、uid、密匙資訊等
等等。
SpringBoot 對 *.properties
和 *.yml
檔案中設定的屬性名稱,它提供了一些繫結規則,它不要求設定的屬性名稱完全與 Bean 中的屬性名稱相同。它支援以下幾種規則的命名方式:
屬性 | 描述 |
---|---|
firstName | 標準的駝峰式命名 |
first-name | 單詞之間通過‘-‘分隔,Spring Boot 推薦這種 |
first_name | 單詞之間通過‘_’分隔 |
FIRST_NAME | 單詞全部大寫並通過‘_’分隔,在使用系統環境變數時,推薦這種 |
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;
}
@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 讀取,程式跟前面例子一樣。
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批次注入組態檔中的屬性 | 一個個指定屬性 |
鬆散繫結 | 支援 | 不支援 |
SPEL(計算式) | 不支援 | 支援 |
JSR303資料校驗 | 支援 | 不支援 |
複雜型別 | 支援 | 不支援 |
@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;
}