SpringBoot中YAML配置文件實(shí)例詳解
一、YAML 簡(jiǎn)介
1、什么是 YAML ?
- YAML(YAML Ain’t Markup Language),一種數(shù)據(jù)序列化格式。
- 這種格式的配置文件近些年逐漸進(jìn)入市場(chǎng),并開(kāi)始占據(jù)主導(dǎo)地位。
2、優(yōu)點(diǎn)
- 較 xml 類(lèi)型和 properties 類(lèi)型相比,更容易閱讀,結(jié)構(gòu)也更加的清晰。
- 容易與腳本語(yǔ)言交互。
- 以數(shù)據(jù)為核心,重?cái)?shù)據(jù)輕格式,輕格式并不是說(shuō)可以不遵守格式,只是格式更加隨性一些。
3、擴(kuò)展名
- 擴(kuò)展名有兩種,無(wú)論是那個(gè)擴(kuò)展名,都是 YAML 格式的配置文件,擁有 YAML 的屬性。
- .yml ,這種擴(kuò)展名更加主流一些
- .yaml
4、語(yǔ)法規(guī)則
- 對(duì)大小寫(xiě)非常敏感,如:定義 age 和 AGE 都會(huì)認(rèn)為是兩個(gè)屬性。
- 屬性層級(jí)關(guān)系使用多行描述,每行結(jié)尾使用冒號(hào)結(jié)束。
- 使用縮進(jìn)表示層級(jí)關(guān)系,同層級(jí)左側(cè)對(duì)齊,只允許使用空格。
- 空格個(gè)數(shù)并不重要,只要保證同層級(jí)的左側(cè)對(duì)齊即可。
- 屬性值前面添加空格。
- #號(hào)表示注釋。
5、格式
server: port: 80
切記:屬性值前面必須有一個(gè)空格。
port 是 server 下的一個(gè)屬性,根據(jù)屬性層級(jí)之間使用多行描述,以及使用縮進(jìn)表示的規(guī)則,port 的書(shū)寫(xiě)位置如上所示,但一般情況下,這種格式我們無(wú)需過(guò)多糾結(jié),我們回車(chē)換行后自動(dòng)提供的格式一般都是正確的。 6、數(shù)組數(shù)據(jù)
name: 準(zhǔn)Java全棧開(kāi)發(fā)工程師 server: port: 80 # 數(shù)組格式 likes: - game - movie - music
數(shù)組數(shù)據(jù)的屬性值換行書(shū)寫(xiě),以 “-” 減號(hào)開(kāi)頭,注意屬性值前空格,如上述 likes 所示。
二、三種配置文件
以配置端口號(hào)為例,介紹三種配置文件及其格式。
1、properties 類(lèi)型
在未接觸到 yaml 之前,我們的配置文件大多數(shù)都是以 properties 結(jié)尾的文件。
server.port=80
格式為:屬性名=屬性值 。
這種方式還是非常常見(jiàn)的,我們之前在配置連接數(shù)據(jù)庫(kù)相關(guān)信息的 jdbc.properties 文件也是使用的該方式。
2、yml 類(lèi)型
server: port: 81
將端口號(hào)設(shè)置為 81 。
3、yaml 類(lèi)型
yml 和 yaml 只是擴(kuò)展名不同而已,其實(shí)是一種類(lèi)型的配置文件。
server: port: 82
4、優(yōu)先級(jí)
當(dāng)項(xiàng)目中同時(shí)存在上述三個(gè)配置文件時(shí),用采用那個(gè)配置文件呢?我們可以通過(guò)觀察端口號(hào)來(lái)獲得優(yōu)先級(jí)順序。
- 端口號(hào)為 80 ,說(shuō)明優(yōu)先采用了 properties 類(lèi)型的配置文件,它的優(yōu)先級(jí)最高。
- 將 properties 配置文件中的配置內(nèi)容刪除,觀察 .yaml 和 .yml 那種文件優(yōu)先級(jí)更高。
- 端口號(hào)又變?yōu)榱?81 ,說(shuō)明 .yml 文件優(yōu)先級(jí)更高一些,雖然 .yaml 只是不同的擴(kuò)展名罷了。
- 總結(jié):優(yōu)先級(jí)由高到低 properties > yml > yaml
三、YAML 代碼提示功能
有很多小伙伴反應(yīng),說(shuō)在寫(xiě) YAML 文件時(shí),代碼不提示。
沒(méi)有代碼提示功能,對(duì)我們開(kāi)發(fā)還是造成了一定的影響的,下面就帶著大家來(lái)解決這個(gè)問(wèn)題。
首先進(jìn)入到模塊管理。
將 YAML 類(lèi)型的兩個(gè)配置文件添加。
選中創(chuàng)建的兩個(gè)配置文件,完成后點(diǎn)擊 “OK” 即可。
此時(shí)的配置文件已經(jīng)變成了三個(gè)。
重新回到配置文件看是否實(shí)現(xiàn)了代碼提示功能。
已經(jīng)實(shí)現(xiàn)了代碼提示功能,雖然是 YAML 文件,但是代碼提示的還是按照 properties 類(lèi)型進(jìn)行的,并不影響,找到需要的屬性直接回車(chē)后還是會(huì)呈現(xiàn)出 YAML 格式。
四、讀取 YAML 配置文件中的數(shù)據(jù)
1、數(shù)據(jù)準(zhǔn)備
sourceName: SpringBoot server: port: 80 user: name: 準(zhǔn)Java全棧開(kāi)發(fā)工程師 age: 22 likes: - music - game - movie
2、方式一:@Value
@SpringBootTest class DemoApplicationTests { @Value("${sourceName}") private String sourceName; @Value("${server.port}") private Integer port; @Value("${user.likes[0]}") private String likes; @Test void contextLoads() { System.out.println(sourceName); System.out.println(port); System.out.println(likes); } }
將要讀取的數(shù)據(jù)定義為屬性,使用 @Value 注解讀取配置文件中的數(shù)據(jù)并注入給屬性,之后在方法體中可以直接使用。
3、方式二:Environment
@SpringBootTest class DemoApplicationTests { @Autowired private Environment environment; @Test void contextLoads() { System.out.println(environment.getProperty("sourceName")); System.out.println(environment.getProperty("server.port")); System.out.println(environment.getProperty("user.likes[0]")); } }
SpringBoot 提供有 Environment 對(duì)象,可以將配置文件中的所有數(shù)據(jù)都封裝到該對(duì)象中,使用 getProperty 方法,將想要讀取的數(shù)據(jù)名作為參數(shù)傳入即可。
4、方式三:自定義對(duì)象
user: name: 準(zhǔn)Java全棧開(kāi)發(fā)工程師 age: 22 likes: - music - game - movie
對(duì)于配置類(lèi)中的 user 數(shù)據(jù),其下還有很多子層,如果我們想一下子將 user 的所有數(shù)據(jù)都取出,應(yīng)該怎么做呢?將其封裝為一個(gè)對(duì)象。
@Component // 將bean的創(chuàng)建工作交由Spring管理 // @ConfigurationProperties 注解表示加載配置文件 // 使用prefix前綴表示只加載指定前綴的數(shù)據(jù) @ConfigurationProperties(prefix = "user") public class User { private String name; private Integer age; private Object[] likes; // get、set、toString和構(gòu)造器方法省略 }
和我們定義實(shí)體類(lèi)沒(méi)有太大的區(qū)別,只是這次不再是和數(shù)據(jù)庫(kù)表中的字段對(duì)應(yīng),而是和配置文件中定義的數(shù)據(jù)對(duì)應(yīng)。
除此之外,還需要使用 ConfigurationProperties 注解加載配置文件,使用 prefix 指定加載數(shù)據(jù)的前綴。
@SpringBootTest class DemoApplicationTests { @Autowired private User user; @Test void contextLoads() { System.out.println(user); } }
使用該方式在定義實(shí)體類(lèi)時(shí),會(huì)報(bào)紅提示
我們只需要在 pom.xml 文件中導(dǎo)入相應(yīng)的依賴(lài)即可。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
總結(jié)
到此這篇關(guān)于SpringBoot中YAML配置文件的文章就介紹到這了,更多相關(guān)SpringBoot YAML配置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot登錄驗(yàn)證token攔截器的實(shí)現(xiàn)
本文主要介紹了SpringBoot登錄驗(yàn)證token攔截器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07java高并發(fā)ScheduledThreadPoolExecutor類(lèi)深度解析
這篇文章主要為大家介紹了java高并發(fā)ScheduledThreadPoolExecutor類(lèi)源碼深度解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11springcloud整合openfeign使用實(shí)例詳解
這篇文章主要介紹了springcloud整合openfeign使用詳解,以springcloud中提供的遠(yuǎn)程接口調(diào)用組件openfeign為例,來(lái)聊聊openfeign的詳細(xì)使用,需要的朋友可以參考下2023-03-03java 學(xué)習(xí)筆記(入門(mén)篇)_多選擇結(jié)構(gòu)switch語(yǔ)句
在java中為多路分支選擇流程專(zhuān)門(mén)提供了switch語(yǔ)句,switch語(yǔ)句根據(jù)一個(gè)表達(dá)式的值,選擇運(yùn)行多個(gè)操作中的一個(gè),感興趣的朋友可以了解下2013-01-01Seata分布式事務(wù)出現(xiàn)ABA問(wèn)題解決
這篇文章主要為大家介紹了Seata分布式事務(wù)出現(xiàn)ABA問(wèn)題解決方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Spring Boot Maven Plugin打包異常解決方案
這篇文章主要介紹了Spring Boot Maven Plugin打包異常解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11淺談如何在項(xiàng)目中使用Spring Cloud Alibaba Sentinel組件
隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來(lái)越重要。本文主要介紹了使用Spring Cloud Alibaba Sentinel組件,感興趣的可以了解一下2021-07-07深入探究MyBatis插件機(jī)制靈活擴(kuò)展及自定義增強(qiáng)框架能力
這篇文章主要介紹了深入探究MyBatis插件機(jī)制靈活擴(kuò)展及自定義增強(qiáng)框架能力2024-01-01