SpringBoot 配置文件使用詳解
- 2022 年 9 月 16 日
- 筆記
- [01-3]Java, JAVA, spring, springboot
一、創建一個SpringBoot項目
創建 SprintBoot 項目的 2 種方式:
- 在 //start.spring.io/ 上創建一個 SpringBoot 項目,然後導入到 IDEA 里。
- 直接在 IDEA 上創建 SpringBoot 項目, File->New->Project, Sprint Initializr,填上相關資訊。
我直接在 //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
作為默認配置文件。
- file:./config/
- file:./config/*/
- file:./
- classpath:/config/
- classpath:/
載入順序依次從上到下,所有文件都會載入,高優先順序的內容會覆蓋低優先順序的內容。
五、其它形式配置
5.1 其它形式配置
其實上面已經有使用到,比如讀取命令行參數資訊到配置文件里。這裡的命令行參數也是一種動態配置資訊。
其它常用配置形式:
- 系統環境變數:在 linux 中經常用到這個。
- 命令行參數:啟動應用時常常會配置的運行參數。
- Java 系統屬性:通過 System.getProperties() 獲取的。
- 一些註解設置的屬性文件,比如 @PropertySource 設置的屬性文件
- 啟動類 SpringApplication.setDefaultProperties 設置的默認屬性
5.2 載入順序怎樣
- 命令行參數
- Java 系統屬性
- 系統環境變數
- 含有 random.* 值的屬性
- application-{profile}.{properties|yml}
- application.{properties|yml}
- 註解 @PropertySource 設置的屬性文件
- 啟動類 SpringApplication.setDefaultProperties 設置的默認屬性
載入順序依次從上到下。
六、配置資訊作用
-
資料庫連接資訊保存
-
項目的啟動資訊,比如 test,dev,prod 環境,埠資訊等
-
一些自定義配置資訊,比如文件上傳地址,調用第三方 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;
}
八、參考
- //docs.spring.io/spring-boot/docs/2.6.11/reference/html/features.html#features.external-config.files
- //docs.spring.io/spring-boot/docs/2.6.11/reference/html/features.html#features.external-config
- //docs.spring.io/spring-boot/docs/2.6.11/reference/html/features.html#features.external-config.command-line-args
- //docs.spring.io/spring-framework/docs/5.3.22/javadoc-api/org/springframework/context/annotation/PropertySource.html
- //fanlychie.github.io/post/spring-boot-properties.html