SpringBoot 配置詳解

Spring Boot配置文件詳解

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

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



文章目錄結(jié)構(gòu):

一、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)雅,注釋更標(biāo)準(zhǔn),適合做配置文件。json作為一種機(jī)器交換格式比yml強(qiáng),更適合做api調(diào)用的數(shù)據(jù)交換。

一)YAML語法

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

字面值:字符串,布爾類型,數(shù)值,日期。字符串默認(rèn)不加引號,單引號會轉(zhuǎn)義特殊字符。日期格式支持yyyy/MM/dd HH:mm:ss

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

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

復(fù)合結(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,每個值占一行,需縮進(jìn)對齊;第二種:[1,2,...n] 行內(nèi)寫法

privateList list;// list可重復(fù)集合

privateSet set;// set不可重復(fù)集合

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

privateMap map;// Map K-V

privateList positions;// 復(fù)合結(jié)構(gòu),集合對象

// 省略getter,setter,toString方法

}

三)YML小結(jié)

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

二、數(shù)組類型,短橫線后面要有空格;對象類型,冒號后面要有空格;

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

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

二、Properties簡介

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

userinfo.account=itdragonBlog

userinfo.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找到)進(jìn)行綁定

*/

@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注解可以通過設(shè)置prefix指定需要批量導(dǎo)入的數(shù)據(jù)。支持獲取字面值,集合,Map,對象等復(fù)雜數(shù)據(jù)。ConfigurationProperties注解還有其他特么呢?它和Spring的Value注解又有什么區(qū)別呢?帶著這些問題,我們繼續(xù)往下看。(??????)??

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

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

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

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

三、對屬性名匹配的要求較低,比如user-name,user_name,userName,USER_NAME都可以取值;

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

五、缺點是不支持強(qiáng)大的SpEL表達(dá)式;

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

二)@ConfigurationProperties詳解

第一步:導(dǎo)入依賴。若要使用ConfigurationProperties注解,需要導(dǎo)入依賴 spring-boot-configuration-processor;

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

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

第四步:校驗數(shù)據(jù)。添加數(shù)據(jù)校驗Validated注解,開啟數(shù)據(jù)校驗,測試其是否支持?jǐn)?shù)據(jù)校驗的功能;

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

導(dǎo)入依賴: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 注解語法類

* 第一步:導(dǎo)入依賴 spring-boot-configuration-processor;

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

* 第三步:設(shè)置prefix屬性,指定需要注入屬性的前綴;

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

*

* 注意點:

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

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

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

*/

@Component

@ConfigurationProperties(prefix ="itdragon")

@Validated

publicclass ConfigurationPropertiesEntity {

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

privateString email;

//? ? @Email? ? ? ? ? ? ? ? ? ? ? // 解析失敗,數(shù)據(jù)校驗成功:BindValidationException: Binding validation errors on itdragon

privateString iphone;

privateList abilities;

privateDate createdDate;// 解析成功,支持松散匹配屬性

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

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

// 省略getter,setter,toString方法

}

三)@Value詳解

上一篇博客已經(jīng)介紹過Value注解的使用,這里只簡單說明。

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

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

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

第四步:測試Value注解是否支持SpEL表達(dá)式;

importorg.springframework.beans.factory.annotation.Value;

importorg.springframework.stereotype.Component;

importorg.springframework.validation.annotation.Validated;

importjavax.validation.constraints.Email;

importjava.util.Date;

importjava.util.List;

/**

* Value 注解語法類

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

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

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

*

* 注意點:

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

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

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

*

* 結(jié)論:

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

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

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

*/

@Component

@Validated

publicclass ValueEntity {

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

privateString nickName;

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

privateString email;

@Email

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

privateString iphone;

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

privateList abilities;

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

privateDate createdDate;

// Value注解的強(qiáng)大一面:支持SpEL表達(dá)式

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

privateString operator;

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

privateBoolean comparison;

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

privateString systemProperties;

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

privateString mapExpression;

// 省略getter,setter,toString方法

}

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

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

二、ConfigurationProperties注解支持?jǐn)?shù)據(jù)校驗,而Value注解不支持;

三、ConfigurationProperties注解支持松散匹配屬性,而Value注解必須嚴(yán)格匹配屬性;

四、ConfigurationProperties不支持強(qiáng)大的SpEL表達(dá)式,而Value支持;

四、配置文件占位符

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

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

二、占位符設(shè)置默認(rèn)值,冒號后面不能有空格

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為完整路徑}

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

importorg.springframework.stereotype.Component;

/**

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

*/

@Component

@ConfigurationProperties(prefix ="ran")

publicclass RandomEntity {

privateString ranValue;// 隨機(jī)生成一個字符串

privateInteger ranInt;// 隨機(jī)生成一個整數(shù)

privateLong ranLong;// 隨機(jī)生成一個長整數(shù)

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

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

privateString ranPlaceholder;// 占位符

// 省略getter,setter,toString方法e

}

測試代碼:

@RunWith(SpringRunner.class)

@SpringBootTest

publicclass SpringBootYmlApplicationTests {

@Autowired

privateUserInfo userInfo;

@Autowired

privateYamlEntity yamlEntity;

@Autowired

privateConfigurationPropertiesEntity configurationPropertiesEntity;

@Autowired

privateValueEntity valueEntity;

@Autowired

privateRandomEntity 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 是專門用來寫配置文件的語言,非常簡潔和強(qiáng)大。

三、YAML 對空格的要求很嚴(yán)格,且不能用Tab鍵代替。

四、YAML 通過空格縮進(jìn)的程度確定層級,冒號后面有空格,短橫線后面有空格。

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

六、ConfigurationProperties注解支持?jǐn)?shù)據(jù)校驗和獲取復(fù)雜的數(shù)據(jù),Value注解支持SpEL表達(dá)式。

本文轉(zhuǎn)載于:http://www.cnblogs.com/itdragon/p/8686554.html(侵刪)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容