Spring Boot 配置文件詳解(小結(jié))
Spring Boot提供了兩種常用的配置文件,分別是properties文件和yml文件。他們的作用都是修改Spring Boot自動配置的默認(rèn)值。相對于properties文件而言,yml文件更年輕,也有很多的坑??芍^成也蕭何敗蕭何,yml通過空格來確定層級關(guān)系,是配置文件結(jié)構(gòu)跟清晰,但也會因?yàn)槲⒉蛔愕赖目崭穸茐牧藢蛹夑P(guān)系。本章重點(diǎn)介紹yml的語法和從配置文件中取值。還在等什么,趕快來學(xué)習(xí)吧!
技術(shù):yaml、properties語法,ConfigurationProperties和Value注解的使用,配置文件占位符的使用
說明:本章重點(diǎn)介紹yaml的語法和ConfigurationProperties注解的使用,測試代碼和完整代碼請移步github,喜歡的朋友可以點(diǎn)個star。
源碼: https://github.com/ITDragonBlog/daydayup/tree/master/SpringBoot/spring-boot-yml
文章目錄結(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的運(yùn)用
創(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)建實(shí)體類YamlEntity.java 獲取配置文件中的屬性值, 通過注解@ConfigurationProperties獲取配置文件中的指定值并注入到實(shí)體類中 。其具體的測試方法和獲取值的原理,請繼續(xù)往后看!
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.Set; /** * YAML 語法實(shí)體類 * 切記點(diǎn): * 一、冒號后面加空格,即 key:(空格)value * 二、每行參數(shù)左邊空格數(shù)量決定了該參數(shù)的層級,不可亂輸入。 */ @Component @ConfigurationProperties(prefix = "yaml") public class YamlEntity { // 字面值,字符串,布爾,數(shù)值 private String str; // 普通字符串 private String specialStr; // 轉(zhuǎn)義特殊字符串 private String specialStr2;// 輸出特殊字符串 private Boolean flag; // 布爾類型 private Integer num; // 整數(shù) private Double dNum; // 小數(shù) // 數(shù)組,List和Set,兩種寫法: 第一種:-空格value,每個值占一行,需縮進(jìn)對齊;第二種:[1,2,...n] 行內(nèi)寫法 private List<Object> list; // list可重復(fù)集合 private Set<Object> set; // set不可重復(fù)集合 // Map和實(shí)體類,兩種寫法:第一種:key空格value,每個值占一行,需縮進(jìn)對齊;第二種:{key: value,....} 行內(nèi)寫法 private Map<String, Object> map; // Map K-V private List<Position> 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/31 16: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
從配置文件中取值注入到實(shí)體類中,和YAML是一樣的。
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; import java.util.Map; /** * 用戶信息 * @ConfigurationProperties : 被修飾類中的所有屬性會和配置文件中的指定值(該值通過prefix找到)進(jìn)行綁定 */ @Component @ConfigurationProperties(prefix = "userinfo") public class UserInfo { private String account; private Integer age; private Boolean active; private Date createdDate; private Map<String, Object> map; private List<Object> list; private Position 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)缺點(diǎn)
ConfigurationProperties注解的優(yōu)缺點(diǎn)
一、可以從配置文件中批量注入屬性;
二、支持獲取復(fù)雜的數(shù)據(jù)類型;
三、對屬性名匹配的要求較低,比如user-name,user_name,userName,USER_NAME都可以取值;
四、支持JAVA的JSR303數(shù)據(jù)校驗(yàn);
五、缺點(diǎn)是不支持強(qiáng)大的SpEL表達(dá)式;
Value注解的優(yōu)缺點(diǎn)正好相反,它只能一個個配置注入值;不支持?jǐn)?shù)組、集合等復(fù)雜的數(shù)據(jù)類型;不支持?jǐn)?shù)據(jù)校驗(yàn);對屬性名匹配有嚴(yán)格的要求。最大的特點(diǎ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容器中。
第四步:校驗(yàn)數(shù)據(jù)。添加數(shù)據(jù)校驗(yàn)Validated注解,開啟數(shù)據(jù)校驗(yàn),測試其是否支持?jǐn)?shù)據(jù)校驗(yàn)的功能;
第五步:測試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/31 15:27:30
匹配和校驗(yàn)數(shù)據(jù):
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.Email; import java.util.Date; import java.util.List; /** * ConfigurationProperties 注解語法類 * 第一步:導(dǎo)入依賴 spring-boot-configuration-processor; * 第二步:把ConfigurationProperties注解修飾的類添加到Spring的IOC容器中; * 第三步:設(shè)置prefix屬性,指定需要注入屬性的前綴; * 第四步:添加數(shù)據(jù)校驗(yàn)注解,開啟數(shù)據(jù)校驗(yàn); * * 注意點(diǎn): * 一、nickName和createdDate在yml配置文件中,對應(yīng)參數(shù)分別是中劃線和下劃線,用于測試其對屬性名匹配的松散性 * 二、email和iphone 測試其支持JSR303數(shù)據(jù)校驗(yàn) * 三、abilities 測試其支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu) */ @Component @ConfigurationProperties(prefix = "itdragon") @Validated public class ConfigurationPropertiesEntity { private String nickName; // 解析成功,支持松散匹配屬性 private String email; // @Email // 解析失敗,數(shù)據(jù)校驗(yàn)成功:BindValidationException: Binding validation errors on itdragon private String iphone; private List<String> abilities; private Date createdDate; // 解析成功,支持松散匹配屬性 // @ConfigurationProperties("#{(1+2-3)/4*5}") private String 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ù)校驗(yàn)Validated注解,開啟數(shù)據(jù)校驗(yàn),測試其是否支持?jǐn)?shù)據(jù)校驗(yàn)的功能;
第四步:測試Value注解是否支持SpEL表達(dá)式;
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ù)校驗(yàn)注解,檢查是否支持?jǐn)?shù)據(jù)校驗(yàn); * * 注意點(diǎn): * 一、nickName和createdDate在yml配置文件中,對應(yīng)參數(shù)分別是中劃線和下劃線,用于測試其對屬性名匹配的松散性 * 二、email和iphone 測試其支持JSR303數(shù)據(jù)校驗(yàn) * 三、abilities 測試其支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu) * * 結(jié)論: * 一、createDate取值必須和yml配置文件中的參數(shù)保持一致, * 二、既是在iphone上添加郵箱驗(yàn)證注解依然可以通過測試, * 三、不支持復(fù)雜的數(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}") // 解析成功,并不支持?jǐn)?shù)據(jù)校驗(yàn) private String iphone; // @Value("${itdragon.abilities}") // 解析錯誤,并不支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu) private List<String> abilities; // @Value("${itdragon.ceatredDate}") // 解析錯誤,并不支持松散匹配屬性,必須嚴(yán)格一致 private Date createdDate; // Value注解的強(qiáng)大一面:支持SpEL表達(dá)式 @Value("#{(1+2-3)/4*5}") // 算術(shù)運(yùn)算 private String operator; @Value("#{1>2 || 2 <= 3}") // 關(guān)系運(yùn)算 private Boolean comparison; @Value("#{systemProperties['java.version']}") // 系統(tǒng)配置:os.name private String systemProperties; @Value("#{T(java.lang.Math).abs(-18)}") // 表達(dá)式 private String mapExpression; // 省略getter,setter,toString方法 }
四)配置文件取值小結(jié)
一、ConfigurationProperties注解支持批量注入,而Value注解適合單個注入;
二、ConfigurationProperties注解支持?jǐn)?shù)據(jù)校驗(yàn),而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為完整路徑}
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * 隨機(jī)數(shù)和占位符語法類 */ @Component @ConfigurationProperties(prefix = "ran") public class RandomEntity { private String ranValue; // 隨機(jī)生成一個字符串 private Integer ranInt; // 隨機(jī)生成一個整數(shù) private Long ranLong; // 隨機(jī)生成一個長整數(shù) private Integer ranIntNum; // 在指定范圍內(nèi)隨機(jī)生成一個整數(shù) private Integer ranIntRange;// 在指定區(qū)間內(nèi)隨機(jī)生成一個整數(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 是專門用來寫配置文件的語言,非常簡潔和強(qiáng)大。
三、YAML 對空格的要求很嚴(yán)格,且不能用Tab鍵代替。
四、YAML 通過空格縮進(jìn)的程度確定層級,冒號后面有空格,短橫線后面有空格。
五、ConfigurationProperties注解適合批量注入配置文件中的屬性,Value注解適合獲取配置文件中的某一項。
六、ConfigurationProperties注解支持?jǐn)?shù)據(jù)校驗(yàn)和獲取復(fù)雜的數(shù)據(jù),Value注解支持SpEL表達(dá)式。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 在SpringBoot下讀取自定義properties配置文件的方法
- springboot如何讀取配置文件(application.yml)中的屬性值
- SpringBoot入坑筆記之spring-boot-starter-web 配置文件的使用
- SpringBoot獲取yml和properties配置文件的內(nèi)容
- 詳解Spring Boot加載properties和yml配置文件
- Spring Boot中配置文件application.properties使用
- spring boot開發(fā)遇到坑之spring-boot-starter-web配置文件使用教程
- SpringBoot配置文件的加載位置實(shí)例詳解
- Spring Boot 把配置文件和日志文件放到j(luò)ar外部
- SpringBoot獲取配置文件的簡單實(shí)現(xiàn)方法
相關(guān)文章
Mybatis-plus獲取雪花算法生成的ID并返回生成ID
本文主要介紹了Mybatis-plus獲取雪花算法生成的ID并返回生成ID,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09Java使用集合實(shí)現(xiàn)斗地主分牌完整代碼
在斗地主游戲中,通常是將一副牌平均分成3份,每份17張牌,并留3張底牌,我們可以使用集合來實(shí)現(xiàn)這一功能,這篇文章主要給大家介紹了關(guān)于Java使用集合實(shí)現(xiàn)斗地主分牌的相關(guān)資料,需要的朋友可以參考下2024-05-05Elasticsearch索引結(jié)構(gòu)與算法解析
?作為搜索引擎的一部分,ES自然具有速度快、結(jié)果準(zhǔn)確、結(jié)果豐富等特點(diǎn),那么ES是如何達(dá)到“搜索引擎”級別的查詢效率呢?首先是索引,其次是壓縮算法,接下來我們就一起了解下ES的索引結(jié)構(gòu)和壓縮算法2023-04-04