【轉(zhuǎn)】Spring Boot配置文件詳解

地址:https://blog.csdn.net/graylf/article/details/80287921

Spring Boot提供了兩種常用的配置文件送爸,分別是properties文件和yml文件。他們的作用都是修改Spring Boot自動配置的默認值小渊。相對于properties文件而言业扒,yml文件更年輕,也有很多的坑⌒憔Γ可謂成也蕭何敗也蕭何,yml通過空格來確定層級關(guān)系莲祸,使配置文件結(jié)構(gòu)更清晰蹂安,但也會因為微不足道的空格而破壞了層級關(guān)系。本章重點介紹yml的語法和從配置文件中取值锐帜。還在等什么田盈,趕快來學習吧!

技術(shù):yaml缴阎、properties語法允瞧,ConfigurationProperties和Value注解的使用,配置文件占位符的使用

一蛮拔、YAML簡介

yml是YAML(YAML Ain't Markup Language)語言的文件述暂,以數(shù)據(jù)為中心,比json建炫、xml等更適合做配置文件

yml和xml相比畦韭,少了一些結(jié)構(gòu)化的代碼,使數(shù)據(jù)更直接踱卵,一目了然廊驼。

yml和json呢?沒有誰好誰壞惋砂,合適才是最好的妒挎。yml的語法比json優(yōu)雅,注釋更標準西饵,適合做配置文件酝掩。json作為一種機器交換格式比yml強,更適合做api調(diào)用的數(shù)據(jù)交換眷柔。

一)YAML語法

以空格的縮進程度來控制層級關(guān)系期虾。空格的個數(shù)并不重要驯嘱,只要左邊空格對齊則視為同一個層級镶苞。注意不能用tab代替空格。且大小寫敏感鞠评。支持字面值茂蚓,對象,數(shù)組三種數(shù)據(jù)結(jié)構(gòu),也支持復合結(jié)構(gòu)聋涨。

字面值:字符串晾浴,布爾類型梳庆,數(shù)值溶握,日期。字符串默認不加引號箭券,單引號會轉(zhuǎn)義特殊字符茂腥。日期格式支持yyyy/MM/dd HH:mm:ss

對象:由鍵值對組成狸涌,形如key:(空格)value的數(shù)據(jù)組成。冒號后面的空格是必須要有的最岗,每組鍵值對占用一行杈抢,且縮進的程度要一致,也可以使用行內(nèi)寫法:{k1: v1, ....kn: vn}

數(shù)組:由形如-(空格)value的數(shù)據(jù)組成仑性。短橫線后面的空格是必須要有的惶楼,每組數(shù)據(jù)占用一行,且縮進的程度要一致诊杆,也可以使用行內(nèi)寫法: [1,2,...n]

復合結(jié)構(gòu):上面三種數(shù)據(jù)結(jié)構(gòu)任意組合

二)YAML的運用

創(chuàng)建一個Spring Boot 的全局配置文件 application.yml歼捐,配置屬性參數(shù)。主要有字符串晨汹,帶特殊字符的字符串豹储,布爾類型,數(shù)值淘这,集合剥扣,行內(nèi)集合,行內(nèi)對象铝穷,集合對象這幾種常用的數(shù)據(jù)格式钠怯。

yaml:? str:字符串可以不加引號? specialStr:"雙引號直接輸出\n特殊字符"? specialStr2:'單引號可以轉(zhuǎn)義\n特殊字符'? flag:false? num:666? Dnum:88.88? list:? ? -one? ? -two? ? -two? set:[1,2,2,3]? map:{k1:v1,k2:v2}? positions:? ? - name:ITDragon? ? ? salary:15000.00? ? - name:ITDragonBlog? ? ? salary:18888.88

創(chuàng)建實體類YamlEntity.java 獲取配置文件中的屬性值,通過注解@ConfigurationProperties獲取配置文件中的指定值并注入到實體類中曙聂。其具體的測試方法和獲取值的原理晦炊,請繼續(xù)往后看!

importorg.springframework.boot.context.properties.ConfigurationProperties;

importorg.springframework.stereotype.Component;importjava.util.List;

importjava.util.Map;importjava.util.Set;

/** * YAML 語法實體類 * 切記點:?

* 一宁脊、冒號后面加空格断国,即 key:(空格)value?

* 二、每行參數(shù)左邊空格數(shù)量決定了該參數(shù)的層級榆苞,不可亂輸入稳衬。 */

@Component

@ConfigurationProperties(prefix ="yaml")

publicclass YamlEntity {

// 字面值,字符串坐漏,布爾薄疚,數(shù)值

privateString str;// 普通字符串

privateString specialStr;// 轉(zhuǎn)義特殊字符串

privateString specialStr2;// 輸出特殊字符串

privateBoolean flag;// 布爾類型

privateInteger num;// 整數(shù)

privateDouble dNum;// 小數(shù)

// 數(shù)組弄砍,List和Set,兩種寫法: 第一種:-空格value输涕,每個值占一行,需縮進對齊慨畸;第二種:[1,2,...n] 行內(nèi)寫法

privateList list;// list可重復集合

privateSet set;// set不可重復集合

// Map和實體類莱坎,兩種寫法:第一種:key空格value,每個值占一行寸士,需縮進對齊檐什;第二種:{key: value,....} 行內(nèi)寫法

privateMap map;// Map?

K-VprivateList positions;// 復合結(jié)構(gòu),集合對象

// 省略getter弱卡,setter乃正,toString方法

}

三)YML小結(jié)

一、字符串可以不加引號婶博,若加雙引號則輸出特殊字符瓮具,若不加或加單引號則轉(zhuǎn)義特殊字符;

二凡人、數(shù)組類型名党,短橫線后面要有空格;對象類型挠轴,冒號后面要有空格传睹;

三、YAML是以空格縮進的程度來控制層級關(guān)系岸晦,但不能用tab鍵代替空格欧啤,大小寫敏感;

四启上、如何讓一個程序員崩潰邢隧?在yml文件中加幾個空格!(〃>皿<)

二冈在、Properties簡介

properties文件大家經(jīng)常用府框,這里就簡單介紹一下。其語法結(jié)構(gòu)形如:key=value讥邻。注意中文亂碼問題迫靖,需要轉(zhuǎn)碼成ASCII。具體如下所示:

userinfo.account=itdragon

Bloguserinfo.age=25

userinfo.active=true

userinfo.created-date=2018/03/3116:54:30

userinfo.map.k1=v1

userinfo.map.k2=v2

userinfo.list=one,two,three

userinfo.position.name=Java架構(gòu)師

userinfo.position.salary=19999.99

從配置文件中取值注入到實體類中兴使,和YAML是一樣的系宜。

importorg.springframework.boot.context.properties.ConfigurationProperties;

importorg.springframework.stereotype.Component;importjava.util.Date;importjava.util.List;

importjava.util.Map;

/** * 用戶信息?

* @ConfigurationProperties : 被修飾類中的所有屬性會和配置文件中的指定值(該值通過prefix找到)進行綁定 */

@Component

@ConfigurationProperties(prefix ="userinfo")

publicclass UserInfo {

privateString account;

privateInteger age;

privateBoolean active;

privateDate createdDate;

privateMap map;

privateList list;

privatePosition position;

// 省略getter,setter发魄,toString方法

}

三盹牧、配置文件取值

Spring Boot通過ConfigurationProperties注解從配置文件中獲取屬性俩垃。從上面的例子可以看出ConfigurationProperties注解可以通過設置prefix指定需要批量導入的數(shù)據(jù)。支持獲取字面值汰寓,集合口柳,Map,對象等復雜數(shù)據(jù)有滑。ConfigurationProperties注解還有其他特么呢跃闹?它和Spring的Value注解又有什么區(qū)別呢?帶著這些問題毛好,我們繼續(xù)往下看望艺。(??????)??

一)ConfigurationProperties和Value優(yōu)缺點

ConfigurationProperties注解的優(yōu)缺點

一、可以從配置文件中批量注入屬性肌访;

二找默、支持獲取復雜的數(shù)據(jù)類型;

三吼驶、對屬性名匹配的要求較低惩激,比如user-name,user_name蟹演,userName咧欣,USER_NAME都可以取值;

四轨帜、支持JAVA的JSR303數(shù)據(jù)校驗魄咕;

五、缺點是不支持強大的SpEL表達式蚌父;

Value注解的優(yōu)缺點正好相反哮兰,它只能一個個配置注入值;不支持數(shù)組苟弛、集合等復雜的數(shù)據(jù)類型喝滞;不支持數(shù)據(jù)校驗;對屬性名匹配有嚴格的要求膏秫。最大的特點是支持SpEL表達式右遭,使其擁有更豐富的功能。

二)@ConfigurationProperties詳解

第一步:導入依賴缤削。若要使用ConfigurationProperties注解窘哈,需要導入依賴 spring-boot-configuration-processor;

第二步:配置數(shù)據(jù)亭敢。在application.yml配置文件中滚婉,配置屬性參數(shù),其前綴為itdragon帅刀,參數(shù)有字面值和數(shù)組让腹,用來判斷是否支持獲取復雜屬性的能力远剩;

第三步:匹配數(shù)據(jù)。在類上添加注解ConfigurationProperties骇窍,并設置prefix屬性值為itdragon瓜晤。并把該類添加到Spring的IOC容器中。

第四步:校驗數(shù)據(jù)腹纳。添加數(shù)據(jù)校驗Validated注解痢掠,開啟數(shù)據(jù)校驗,測試其是否支持數(shù)據(jù)校驗的功能只估;

第五步:測試ConfigurationProperties注解是否支持SpEL表達式;

導入依賴:pom.xml 添加 spring-boot-configuration-processor依賴

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-configuration-processor</artifactId>

<optional>true</optional>

</dependency>

配置數(shù)據(jù):application.yml 配置屬性參數(shù)着绷,nick-name是用來判斷匹配屬性的松散性蛔钙,若換成nick_name依然可以獲取值。

itdragon:? nick-name:ITDragonBlog? email:1234567890@qq.com? iphone:1234567890? abilities:[java,sql,html]? created_date:2018/03/3115:27:30

匹配和校驗數(shù)據(jù):

importorg.springframework.boot.context.properties.ConfigurationProperties;

importorg.springframework.stereotype.Component;

importorg.springframework.validation.annotation.Validated;

importjavax.validation.constraints.Email;

importjava.util.Date;importjava.util.List;

/** * ConfigurationProperties 注解語法類?

* 第一步:導入依賴 spring-boot-configuration-processor荠医;?

* 第二步:把ConfigurationProperties注解修飾的類添加到Spring的IOC容器中吁脱;?

* 第三步:設置prefix屬性,指定需要注入屬性的前綴彬向;

?* 第四步:添加數(shù)據(jù)校驗注解兼贡,開啟數(shù)據(jù)校驗; *

?* 注意點:?

* 一娃胆、nickName和createdDate在yml配置文件中遍希,對應參數(shù)分別是中劃線和下劃線,用于測試其對屬性名匹配的松散性?

* 二里烦、email和iphone 測試其支持JSR303數(shù)據(jù)校驗?

* 三凿蒜、abilities 測試其支持復雜的數(shù)據(jù)結(jié)構(gòu) */

@Component

@ConfigurationProperties(prefix ="itdragon")

@Validatedpublicclass?

ConfigurationPropertiesEntity {

privateString nickName;// 解析成功,支持松散匹配屬性

privateString email;//? ? @Email? ? ? ? ? ? ? ? ? ? ? // 解析失敗胁黑,數(shù)據(jù)校驗成功:

BindValidationException: Binding validation errors on itdragonprivateString iphone;

privateList abilities;privateDate createdDate;// 解析成功废封,支持松散匹配屬性//? ??

@ConfigurationProperties("#{(1+2-3)/4*5}")

privateString operator;// 語法報錯,不支持SpEL表達式:not applicable to field

// 省略getter丧蘸,setter漂洋,toString方法

}

三)@Value詳解

第一步:在屬性上添加Value注解,通過${}設置參數(shù)從配置文件中注入值力喷;

第二步:修改${itdragon.ceatred_date}中的參數(shù)值刽漂,改為${itdragon.ceatredDate}測試是否能解析成功;

第三步:添加數(shù)據(jù)校驗Validated注解弟孟,開啟數(shù)據(jù)校驗爽冕,測試其是否支持數(shù)據(jù)校驗的功能;

第四步:測試Value注解是否支持SpEL表達式披蕉;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Component;

import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.Email;

import java.util.Date;

import java.util.List;

/**

* Value 注解語法類

* 第一步:在屬性上添加注解Value注入?yún)?shù)

* 第二步:把Value注解修飾的類添加到Spring的IOC容器中颈畸;

* 第三步:添加數(shù)據(jù)校驗注解乌奇,檢查是否支持數(shù)據(jù)校驗;

*

* 注意點:

* 一眯娱、nickName和createdDate在yml配置文件中礁苗,對應參數(shù)分別是中劃線和下劃線,用于測試其對屬性名匹配的松散性

* 二徙缴、email和iphone 測試其支持JSR303數(shù)據(jù)校驗

* 三试伙、abilities 測試其支持復雜的數(shù)據(jù)結(jié)構(gòu)

*

* 結(jié)論:

* 一、createDate取值必須和yml配置文件中的參數(shù)保持一致于样,

* 二疏叨、既是在iphone上添加郵箱驗證注解依然可以通過測試,

* 三穿剖、不支持復雜的數(shù)據(jù)結(jié)構(gòu)蚤蔓,提示錯誤和第一條相同:IllegalArgumentException: Could not resolve placeholder 'itdragon.abilities' in value "${itdragon.abilities}"

*/

@Component

@Validated

public class ValueEntity {

? ? @Value("${itdragon.nick-name}")

? ? private String nickName;

? ? @Value("${itdragon.email}")

? ? private String email;

? ? @Email

? ? @Value("${itdragon.iphone}")? ? ? ? // 解析成功,并不支持數(shù)據(jù)校驗

? ? private String iphone;

//? ? @Value("${itdragon.abilities}")? ? // 解析錯誤糊余,并不支持復雜的數(shù)據(jù)結(jié)構(gòu)

? ? private List<String> abilities;

//? ? @Value("${itdragon.ceatredDate}")? // 解析錯誤秀又,并不支持松散匹配屬性,必須嚴格一致

? ? private Date createdDate;

? ? // Value注解的強大一面:支持SpEL表達式

? ? @Value("#{(1+2-3)/4*5}")? ? ? ? ? ? // 算術(shù)運算

? ? private String operator;

? ? @Value("#{1>2 || 2 <= 3}")? ? ? ? ? // 關(guān)系運算

? ? private Boolean comparison;

? ? @Value("#{systemProperties['java.version']}") // 系統(tǒng)配置:os.name

? ? private String systemProperties;

? ? @Value("#{T(java.lang.Math).abs(-18)}") // 表達式

? ? private String mapExpression;

? ? // 省略getter贬芥,setter吐辙,toString方法

}

四)配置文件取值小結(jié)

一、ConfigurationProperties注解支持批量注入蘸劈,而Value注解適合單個注入昏苏;

二、ConfigurationProperties注解支持數(shù)據(jù)校驗威沫,而Value注解不支持捷雕;

三、ConfigurationProperties注解支持松散匹配屬性壹甥,而Value注解必須嚴格匹配屬性救巷;

四、ConfigurationProperties不支持強大的SpEL表達式句柠,而Value支持浦译;

四、配置文件占位符

占位符和隨機數(shù)比較簡單溯职,這里就直接貼出代碼精盅。需要注意的是:

一、占位符的值必須是完整路徑

二谜酒、占位符設置默認值叹俏,冒號后面不能有空格

ran: # 這里的prefix不能是random,

? ran-value: ${random.value}

? ran-int: ${random.int}

? ran-long: ${random.long}

? ran-int-num: ${random.int(10)}

? ran-int-range: ${random.int[10,20]}

? ran-placeholder: placeholder_${ran.ran-value:此處不能有空格僻族,且key為完整路徑}

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.stereotype.Component;

/**

* 隨機數(shù)和占位符語法類

*/

@Component

@ConfigurationProperties(prefix = "ran")

public class RandomEntity {

? ? private String ranValue;? ? // 隨機生成一個字符串

? ? private Integer ranInt;? ? // 隨機生成一個整數(shù)

? ? private Long ranLong;? ? ? // 隨機生成一個長整數(shù)

? ? private Integer ranIntNum;? // 在指定范圍內(nèi)隨機生成一個整數(shù)

? ? private Integer ranIntRange;// 在指定區(qū)間內(nèi)隨機生成一個整數(shù)

? ? private String ranPlaceholder;// 占位符

? ? // 省略getter粘驰,setter屡谐,toString方法e

}

測試代碼:

@RunWith(SpringRunner.class)

@SpringBootTest

public class SpringBootYmlApplicationTests {

? ? @Autowired

? ? private UserInfo userInfo;

? ? @Autowired

? ? private YamlEntity yamlEntity;

? ? @Autowired

? ? private ConfigurationPropertiesEntity configurationPropertiesEntity;

? ? @Autowired

? ? private ValueEntity valueEntity;

? ? @Autowired

? ? private RandomEntity randomEntity;

? ? @Test

? ? public void contextLoads() {

//? ? ? System.out.println("YAML Grammar : " + yamlEntity);

//? ? ? System.out.println("UserInfo : " + userInfo);

//? ? ? System.out.println("ConfigurationProperties Grammar : " + configurationPropertiesEntity);

//? ? ? System.out.println("Value Grammar : " + valueEntity);

? ? ? ? System.out.println("Random Grammar : " + randomEntity);

? ? }

}

五、總結(jié)

一蝌数、Spring Boot 支持兩種格式的配置文件愕掏,其中YAML的數(shù)據(jù)結(jié)構(gòu)比properties更清晰。

二顶伞、YAML 是專門用來寫配置文件的語言饵撑,非常簡潔和強大。

三唆貌、YAML 對空格的要求很嚴格滑潘,且不能用Tab鍵代替。

四锨咙、YAML 通過空格縮進的程度確定層級语卤,冒號后面有空格,短橫線后面有空格蓖租。

五粱侣、ConfigurationProperties注解適合批量注入配置文件中的屬性羊壹,Value注解適合獲取配置文件中的某一項蓖宦。

六、ConfigurationProperties注解支持數(shù)據(jù)校驗和獲取復雜的數(shù)據(jù)油猫,Value注解支持SpEL表達式稠茂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市情妖,隨后出現(xiàn)的幾起案子睬关,更是在濱河造成了極大的恐慌,老刑警劉巖毡证,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件电爹,死亡現(xiàn)場離奇詭異,居然都是意外死亡料睛,警方通過查閱死者的電腦和手機丐箩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恤煞,“玉大人屎勘,你說我怎么就攤上這事【影牵” “怎么了概漱?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喜喂。 經(jīng)常有香客問我瓤摧,道長竿裂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任姻灶,我火速辦了婚禮铛绰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘产喉。我一直安慰自己捂掰,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布曾沈。 她就那樣靜靜地躺著这嚣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪塞俱。 梳的紋絲不亂的頭發(fā)上姐帚,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音障涯,去河邊找鬼罐旗。 笑死,一個胖子當著我的面吹牛唯蝶,可吹牛的內(nèi)容都是我干的九秀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼粘我,長吁一口氣:“原來是場噩夢啊……” “哼鼓蜒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起征字,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤都弹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后匙姜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畅厢,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年氮昧,在試婚紗的時候發(fā)現(xiàn)自己被綠了框杜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡郭计,死狀恐怖霸琴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昭伸,我是刑警寧澤梧乘,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響选调,放射性物質(zhì)發(fā)生泄漏夹供。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一仁堪、第九天 我趴在偏房一處隱蔽的房頂上張望哮洽。 院中可真熱鬧,春花似錦弦聂、人聲如沸鸟辅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匪凉。三九已至,卻和暖如春捺檬,著一層夾襖步出監(jiān)牢的瞬間再层,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工堡纬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留聂受,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓烤镐,卻偏偏與公主長得像蛋济,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子职车,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353