Springboot配置文件相關(guān)語法及讀取方式詳解
配置文件的形式
目前,springboot的配置文件有2種形式。
1、.properties文件,一般習(xí)慣稱其為properties文件,e.g.application.properties;
2、.yml/.yaml文件(2個(gè)后綴都是一樣的文件,一般常用.yml),一般習(xí)慣稱其為yaml文件,e.g.application.yml/application.yaml;
語法
它只有2種核心語法,一種是key-value,一種是數(shù)組,以下以.yml文件為主。
1、key-value形式
它支持字符串類型(支持轉(zhuǎn)義字符,比如\n同樣會(huì)換行,本質(zhì)就是String類型),數(shù)字類型和boolean類型,如下:
# .yml文件示例 config0: string: abcd # 字符串 number: 123 # 數(shù)字類型 boolean: true # boolean類型 # .properties文件示例 # config0.string=abcd # config0.number=123 # config0.boolean=true
最常見的讀取方式示例如下:
@Value("${config0.string}")
private String config0String;
@Value("${config0.number}")
private int config0Number;
@Value("${config0.boolean}")
private boolean config0Boolean;.yml文件還有另外一種行內(nèi)寫法(可讀性很差,所以并不常用),如下:
# 注意相關(guān)空格,且沒有任何引號(hào)。否則無法識(shí)別拋出異常
config0: {string: abcd,number: 123,boolean: true}注:行內(nèi)寫法并不能直接轉(zhuǎn)為map,也只能通過config0.string...進(jìn)行讀取。
2、數(shù)組形式
它支持字符串類型(支持轉(zhuǎn)義字符,比如\n同樣會(huì)換行,本質(zhì)就是String類型),數(shù)字類型和boolean類型,如下:
# .yml文件示例,注意相關(guān)空格
config1:
list:
- abcd # 字符串類型
- 123 # 數(shù)字類型
- true # boolean類型
# .properties文件示例
#config1.list[0]=abcd
#config1.list[1]=123
#config1.list[2]=true最常見的讀取方式示例如下:
@Value("${config1.list[0]}")
private String config1String;
@Value("${config1.list[1]}")
private int config1Number;
@Value("${config1.list[2]}")
private boolean config1Boolean;.yml文件還有另外一種行內(nèi)寫法(可讀性很差,所以并不常用),如下:
config1: list: [abcd, 123, true]
注:行內(nèi)寫法并不能直接轉(zhuǎn)為list,也只能通過config1.list[0]...進(jìn)行讀取。
總結(jié):不管配置文件多么的花里胡哨,都是由上面2種類型構(gòu)造而成。如下嘗試構(gòu)建一個(gè)復(fù)雜的配置文件。
# .yml文件示例 config2: card: - visa: 招商銀行信用卡 - visa: 浦發(fā)銀行信用卡 - 建設(shè)銀行 - 中國銀行 - 農(nóng)業(yè)銀行 - 工商銀行 name: 張三 age : 28 # .properties文件示例 # config2.card[0].visa=招商銀行信用卡 # config2.card[1].visa=浦發(fā)銀行信用卡 # config2.card[2]=建設(shè)銀行 # config2.card[3]=中國銀行 # config2.card[4]=農(nóng)業(yè)銀行 # config2.card[5]=工商銀行 # config2.name=張三 # config2.age=28
讀取方式如下:
@Value("${config2.card[0].visa}")
private String visa1;
@Value("${config2.card[1].visa}")
private String visa2;
@Value("${config2.card[2]}")
private String bankcard1;
@Value("${config2.card[3]}")
private String bankcard2;
@Value("${config2.card[4]}")
private String bankcard3;
@Value("${config2.card[5]}")
private String bankcard4;
@Value("${config2.name}")
private String name;
@Value("${config2.age}")
private int age;說明:上面的寫法是不能直接轉(zhuǎn)為java代碼中的map和list,不過,它是支持直接轉(zhuǎn)為map和list的。但是,直接轉(zhuǎn)為map和list和上面的寫法實(shí)現(xiàn)的目的是一樣的,需要遵循一些特殊寫法,如果需要在代碼中傳遞map或者list,在代碼中重新構(gòu)造即可,利用配置文件直接轉(zhuǎn)map或list,就是脫褲子放屁,核心就是上面的2種語法。
讀取方式
1、通過@value注解
上面已經(jīng)對(duì)其進(jìn)行過說明,這里舉例說明一下,直接將配置項(xiàng)轉(zhuǎn)map有多雞肋。
配置項(xiàng):
config:
map: '{"name": "張三", "age": 18}'代碼:
// 外面需要包一個(gè)#{}
@Value("#{${config.map}}")
private Map<String, Object> configMap;我認(rèn)為,它不僅可讀性差,還容易出錯(cuò),如果需要使用map,還不如讀取3個(gè)配置項(xiàng),重新構(gòu)造一個(gè)map對(duì)象。
注:不管是直接轉(zhuǎn)map的表達(dá)式還是上面的數(shù)組項(xiàng)讀取,都是由SpringEL表達(dá)式提供解析。
2、通過@ConfigurationProperties注解
使用@ConfigurationProperties注解的時(shí)候,建議引入以下jar包(編譯器會(huì)出現(xiàn)警告):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>它常用于批量解析配置項(xiàng),所以構(gòu)建配置類的時(shí)候,用它就特別方便。
它與@Value有以下區(qū)別
1、@ConfigurationProperties不支持SringEL表達(dá)式,所以這里注意,它不能解析key-value與數(shù)組結(jié)合的形式,如下:
如果引入了<spring-boot-configuration-processor>jar包,這種復(fù)雜寫法編譯器會(huì)在配置文件中報(bào)錯(cuò)的。
# @ConfigurationProperties不能解析
config:
card:
- visa: 招商銀行信用卡
- visa: 浦發(fā)銀行信用卡
- 建設(shè)銀行
- 中國銀行
- 農(nóng)業(yè)銀行
- 工商銀行2、@ConfigurationProperties對(duì)于直接map和list比較方便;
3、@ConfigurationProperties支持JSR303數(shù)據(jù)校驗(yàn)。
@ConfigurationProperties注解常用屬性
1、prefix:用于指定配置項(xiàng)前綴;
2、value:同prefix,建議使用prefix,語義更明顯;
3、ignoreInvalidFields:忽略受校驗(yàn)的字段,默認(rèn)false;
4、ignoreUnknownFields忽略未識(shí)別的字段,默認(rèn)true。
配置文件:
config:
user:
name: 張三
cards:
- 招商銀行
- 建設(shè)銀行
age: 28
map: {key1: value1,key2: value2}讀取代碼:
注:用@ConfigurationProperties讀取的時(shí)候,一定要提供set方法。
@Component
@ConfigurationProperties(prefix = "config.user")
public class UserBean {
private String name;
private List<String> cards;
private String age;
private Map<String, String> map;
// 省略get/set
}3、通過Environment(org.springframework.core.env.Environment)讀取
配置文件:
# 注意相關(guān)空格
config1:
list:
- abcd # 字符串類型
- 123 # 數(shù)字類型
- true # boolean類型讀取代碼:
// 常用下面2個(gè)方法,一個(gè)是默認(rèn)以String類型讀取,一個(gè)是指定類型讀取
String config0String = env.getProperty("config0String");
int config0Number = env.getProperty("config0Number", Integer.class);
boolean config0Boolean = env.getProperty("config0Boolean", Boolean.class);根據(jù)實(shí)際場景,選擇最適合的方式就是好方式。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
分布式調(diào)度器之Spring Task 的使用詳解
SpringTask是Spring框架中用于任務(wù)調(diào)度的組件,通過簡單的注解就能實(shí)現(xiàn)定時(shí)任務(wù)的創(chuàng)建和調(diào)度,可以通過配置線程池來實(shí)現(xiàn),本文給大家介紹分布式調(diào)度器之Spring Task 的使用,感興趣的朋友跟隨小編一起看看吧2024-10-10
java集合與數(shù)組的相同點(diǎn)和不同點(diǎn)
今天小編就為大家分享一篇關(guān)于java集合與數(shù)組的相同點(diǎn)和不同點(diǎn),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04
SpringMVC Tomcat控制臺(tái)亂碼問題解決方案
這篇文章主要介紹了SpringMVC Tomcat控制臺(tái)亂碼問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Java開發(fā)中synchronized的定義及用法詳解
這篇文章主要介紹了Java開發(fā)中synchronized的定義及用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Java使用wait/notify實(shí)現(xiàn)線程間通信下篇
wait()和notify()是直接隸屬于Object類,也就是說所有對(duì)象都擁有這一對(duì)方法,下面這篇文章主要給大家介紹了關(guān)于使用wait/notify實(shí)現(xiàn)線程間通信的相關(guān)資料,需要的朋友可以參考下2022-12-12
Springboot中實(shí)現(xiàn)策略模式+工廠模式的方法
這篇文章主要介紹了Springboot中實(shí)現(xiàn)策略模式+工廠模式,具體策略模式和工廠模式的UML我就不給出來了,使用這個(gè)這兩個(gè)模式主要是防止程序中出現(xiàn)大量的IF ELSE IF ELSE....,接下來咱們直接實(shí)現(xiàn)Springboot策略模式工廠模式2022-03-03
Java基于動(dòng)態(tài)規(guī)劃法實(shí)現(xiàn)求最長公共子序列及最長公共子字符串示例
這篇文章主要介紹了Java基于動(dòng)態(tài)規(guī)劃法實(shí)現(xiàn)求最長公共子序列及最長公共子字符串,簡單描述了動(dòng)態(tài)規(guī)劃法的概念、原理,并結(jié)合實(shí)例形式分析了Java使用動(dòng)態(tài)規(guī)劃法求最長公共子序列以及最長公共子字符串相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-08-08
Spring配置多個(gè)數(shù)據(jù)源并實(shí)現(xiàn)動(dòng)態(tài)切換示例
本篇文章主要介紹了Spring配置多個(gè)數(shù)據(jù)源并實(shí)現(xiàn)動(dòng)態(tài)切換示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04

