SpringBoot的配置文件(properties與yml)使用方法
1. 配置文件的作用
SpringBoot 項(xiàng)目中所有重要的數(shù)據(jù)都是在配置文件中配置的,比如∶
- 數(shù)據(jù)庫的連接信息(包含用戶名和密碼的設(shè)置);
- 項(xiàng)目的啟動(dòng)端口;
- 第三方系統(tǒng)的調(diào)用秘鑰等信息;
- 用于發(fā)現(xiàn)和定位問題的普通日志和異常日志;
- 還可以自定義配置,如配置上傳文件的保存地址信息等。
想象一下如果沒有配置信息,那么 Spring Boot 項(xiàng)目就不能連接和操作數(shù)據(jù)庫,甚至是不能保存可以用于排查問題的關(guān)鍵日志,所以配置文件的作用是非常重要的。
配置文件中的配置類型有兩類,一類是系統(tǒng)配置項(xiàng),這種配置的格式都是固定的,是給系統(tǒng)(框架)使用的;另一種是用戶自定義配置,用戶可以隨意地規(guī)定配置項(xiàng)的格式,又用戶自行去設(shè)置和讀取。
2. 配置文件格式
SpringBoot 項(xiàng)目配置文件有兩種,一種是項(xiàng)目創(chuàng)建默認(rèn)自帶的的 properties
文件,還有一種比較新的 yml
文件(需要自己添加)。
配置文件是存在于 resources
目錄下的,對(duì)于 SpringBoot 項(xiàng)目默認(rèn)的配置文件,配置文件名必須是 application
,即 application.properties
或 application.yml
文件,如果配置文件名不為 application
那就不能夠被識(shí)別加載。
properties
是可以和 yml
?起存在于?個(gè)項(xiàng)?當(dāng)中的, yml
文件相比于 properties
文件做了一些優(yōu)化,如 yml
文件天然支持中文字符,而 properties
文件默認(rèn)是不支持中文字符的,如果不進(jìn)行字符配置,輸入中文字符就會(huì)有亂碼現(xiàn)象。
當(dāng) application.properties
和 application.yml
兩個(gè)文件共存時(shí), 雖然兩個(gè)文件中的配置都會(huì)被加載,但如果這兩個(gè)配置?件中出現(xiàn)了同樣的配置(比如 properties 和 yml 中都配置了“server.port” ), 那么這個(gè)時(shí)候會(huì)以 properties
中的配置為主,也就是 .properties
配置?件的優(yōu)先級(jí)最?。
雖然理論上來講 .properties 可以和 .yml 共存,但實(shí)際的業(yè)務(wù)當(dāng)中,我們通常會(huì)采取?種統(tǒng)?的配置?件格式,這樣可以更好的維護(hù)(降低故障率)。
3. 配置文件的使用方法
properties 配置文件是最早期的配置文件格式,也是創(chuàng)建 Spring Boot 項(xiàng)目默認(rèn)的配置文件。
3.1. properties配置文件
3.1.1. 基本語法和使用
??基本語法:
properties 是以鍵值的形式配置的,key 和 value 之間是以“=”連接的, 使?“#”來添加注釋信息。
# key與=與value之間不要加空格 key=value
比如,設(shè)置端口號(hào),我們可以使用配置項(xiàng) server.port
來設(shè)置端口:
server.port=8088
配置修改完畢后,啟動(dòng)程序,就可以看到端口號(hào)已經(jīng)設(shè)置成配置文件中所設(shè)置的端口號(hào)了。
還有比如設(shè)置數(shù)據(jù)庫,配置項(xiàng)如下:
# 配置數(shù)據(jù)庫 URL spring.datasource.url="jdbc:mysql://127.0.0.1:3306/tr?characterEncoding=utf8&useSSL=false" # 配置數(shù)據(jù)庫 username spring.datasource.name="root" # 配置數(shù)據(jù)庫 password spring.datasource.password="111111" # 設(shè)置驅(qū)動(dòng) spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
有關(guān)更多系統(tǒng)的配置,可以去看看官方文檔:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties
除了設(shè)置配置文件的信息除了系統(tǒng)的配置,我們還可以自定義配置,比如:
# 用戶自定義配置 custom.name=zhangsan custom.id=666
??此時(shí)要讀取配置文件中的信息,我們可以使用 @Value
注解來實(shí)現(xiàn),規(guī)則如下:
// 要注意${}不能省略 @Value("${配置信息key}") private String name;
示例代碼:
package com.example.springboot.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @ResponseBody public class TestController2 { // 自定義配置和系統(tǒng)配置都可以讀取 @Value("${custom.name}") private String name; @Value("${custom.id}") private String id; @Value("${server.port}") private String port; @RequestMapping("/coustom") public String sayHi() { return "name : " + name + " " + "id : " + id + " " + "port : " + port; } }
瀏覽器訪問結(jié)果:
3.1.2. properties優(yōu)缺點(diǎn)分析
優(yōu)點(diǎn):
- 配置文件結(jié)構(gòu)清晰:key=value,不容易出錯(cuò),適合初學(xué)者。
缺點(diǎn):
寫法上比較冗余,臃腫,yml 配置文件能夠解決這個(gè)問題。
3.2. yml配置文件
yml 是 YMAL(Yet Another Markup language)的縮寫,翻譯為另一種標(biāo)記語言。
3.2.1. 基本語法與使用
??基本語法:
yml 是樹型結(jié)構(gòu)配置文件,特別需要注意的是 key 和 value 之間需要使用英文冒號(hào)加空格,空格一定是不能省略的。
# :后面空格一定不能省 key: value
此時(shí),將上面的 propertise
轉(zhuǎn)換成 yml
格式看一下。
# 配置端口 server: port: 8088 # 配置數(shù)據(jù)庫 spring: datasource: url: "jdbc:mysql://127.0.0.1:3306/tr?characterEncoding=utf8&useSSL=false" username: "root" password: "111111" # 自定義配置信息 custom: name: zhangsan id: 666
這里讀取 yml 配置文件的方式和 properties 配置文件是一樣的,就不再演示了。
3.2.2. yml中單雙引號(hào)問題
我們嘗試將配置文件中的配置信息設(shè)置成如下字樣:
string: str1: Hello \n Spring Boot. str2: 'Hello \n Spring Boot.' str3: "Hello \n Spring Boot."
我們將這些配置信息注入到一個(gè)類,我們嘗試來讀取它們,這個(gè)代碼 @Controller 在 Spring Boot 啟動(dòng)時(shí)候會(huì)把 YmlString 對(duì)象注?到框架中,當(dāng)注?到框架中時(shí)會(huì)執(zhí)? @PostConstruct 初始化方法,就是此時(shí)讀到的配置信息。
@Controller public class YmlString { @Value("${string.str1}") private String str1; @Value("${string.str2}") private String str2; @Value("${string.str3}") private String str3; @PostConstruct public void postConstruct() { System.out.println("string.str1:" + str1); System.out.println("string.str2:" + str2); System.out.println("string.str3:" + str3); } }
控制臺(tái)輸出結(jié)果:
這就說明,被雙引號(hào)包裹的值,是按照原語義執(zhí)行的,而被單引號(hào)包裹值(特殊字符)會(huì)發(fā)生轉(zhuǎn)義,像上面的例子就是 \n
轉(zhuǎn)義成了 \\n
,所以就輸出了 \n
,最終就只是一個(gè)普通的字符串。
至于不加雙引號(hào)的輸出結(jié)果是因?yàn)?yml 中字符串默認(rèn)是不加引號(hào)的,就直接輸出了。
3.2.3. yml配置不同類型的數(shù)據(jù)類型及null
格式如下:
# 字符串 string.value: Hello # 布爾值,true或false boolean.value: true boolean.value1: false # 整數(shù) int.value: 10 int.value1: 0b1010_0111_0100_1010_1110 # ?進(jìn)制 # 浮點(diǎn)數(shù) float.value: 3.14159 float.value1: 314159e-5 # 科學(xué)計(jì)數(shù)法 # Null,~代表null null.value: ~
使用:
package com.example.springboot.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @Component public class TestController3 { @Value("${string.value}") private String str; @Value("${boolean.value}") private boolean bool; @Value("${float.value}") private float flo; @Value("${null.value}") private Integer nul; @PostConstruct public void postConsrtuct() { System.out.println("str: " + str); System.out.println("bool: " + bool); System.out.println("flo: " + flo); System.out.println("nul: " + nul); } }
運(yùn)行結(jié)果:
3.2.4. 配置對(duì)象
對(duì)于 ym l配置文件,還能進(jìn)行對(duì)象的配置,如設(shè)置一個(gè) Student
對(duì)象:
方式1:
student: id: 1 name: 張三 age: 18
方式2:
student: {id: 1,name: 張三,age: 18}
此時(shí)從配置文件讀取自定義的對(duì)象,就不可以使用 @Value 注解來讀取了,需要使用 @ConfigurationProperties
注解來進(jìn)行對(duì)象的讀取,并且對(duì)應(yīng)的類必須有 getter和setter
方法。
??示例:
學(xué)生類:
我們這里就不自己寫 getter和setter
方法了,我們使用 Lombok 框架中的 @Data 注解即可,其中就包含了get,set 和 toString,免去了手動(dòng)創(chuàng)建的步驟了。
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Data @ConfigurationProperties(prefix = "student") @Component public class Student { private int id; private String name; private int age; }
使用類:
package com.example.springboot.controller; import com.example.springboot.model.Student; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import javax.annotation.PostConstruct; @Controller public class ConfigController { @Autowired private Student student; @PostConstruct public void postConsrtuct() { System.out.println(student); } }
運(yùn)行結(jié)果:
3.2.5. 配置集合
yml 還能配置集合
??比如配置 list 集合,配置方式如下:
方式1:
dbtypes: name: - mysql - sqlserver - db2
方式2(推薦):
dbtypes: {name: [mysql, sqlserver, db2]}
獲取與對(duì)象的獲取方式一模一樣,只是現(xiàn)在需要類里面的一個(gè)屬性為集合對(duì)象。
獲取示例:
與配置文件對(duì)應(yīng)的對(duì)象。
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.List; @Data @ConfigurationProperties(prefix = "dbtypes") @Component public class ConfigList { private List<String> name; }
使用類:
package com.example.springboot.controller; import com.example.springboot.model.ConfigList; import org.springframework.stereotype.Controller; import javax.annotation.PostConstruct; import javax.annotation.Resource; @Controller public class ConfigController { @Resource private ConfigList configList; @PostConstruct public void postConstruct() { System.out.println(configList.getName()); } }
運(yùn)行結(jié)果:
??再比如配置 map 集合,配置方式如下:
方式1:
tes: map: 1: 張三 2: 李四
方式2:
tes: maps: {1: 張三,2: 李四}
獲取示例:
與配置文件對(duì)應(yīng)的對(duì)象:
package com.example.springboot.model; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Map; @Data @ConfigurationProperties(prefix = "tes") @Component public class ConfigMap { private Map<Integer, String> map; }
使用類:
package com.example.springboot.controller; import com.example.springboot.model.ConfigMap; import org.springframework.stereotype.Controller; import javax.annotation.PostConstruct; import javax.annotation.Resource; @Controller public class ConfigController2 { @Resource private ConfigMap configMap; @PostConstruct public void postConstruct() { System.out.println(configMap.toString()); } }
運(yùn)行結(jié)果:
3.2.6. yml優(yōu)點(diǎn)分析
- yml 是?個(gè)可讀性?,寫法簡單、易于理解,它的語法和 JSON 語?類似。
- yml ?持更多的數(shù)據(jù)類型,它可以簡單表達(dá)清單(數(shù)組)、散列表,標(biāo)量等數(shù)據(jù)形態(tài)。
- 它使?空? 符號(hào)縮進(jìn)和?量依賴外觀的特?,特別適合?來表達(dá)或編輯數(shù)據(jù)結(jié)構(gòu)、各種配置?件等。
- yml ?持更多的編程語?,它不?是 Java 中可以使?在 Golang、PHP、Python、Ruby、 JavaScript、Perl 中。
4. properties與yml的區(qū)別
- 語法不同:properties 是 以key = value 的形式配置的鍵值類型的配置文件,而 yml 使用的是類似于 json 格式的樹型配置方式進(jìn)行配置的,yml 層級(jí)之間使用的是換行縮進(jìn)的方式配置的,key 和 value 之間使用英文冒號(hào):加空格的方式設(shè)置的,且空格不可省略。
- properties 為早期并且默認(rèn)的配置文件格式,但配置存在一定的冗余數(shù)據(jù),使用 yml 可以很好的解決數(shù)據(jù)冗余問題。
- yml 通用性更好,支持更多語言,如 Java、Go、Python,如果是云服務(wù)器開發(fā),可以使用一份 yml 配置文件作為 Java 和 Go 的共同配置文件。
- yml 和 properties 可以共存,但一個(gè)項(xiàng)目中建議使用統(tǒng)一的配置類型文件。
yml 相較于 properties 支持更多的數(shù)據(jù)類型,如對(duì)象和集合。
5. 設(shè)置不同環(huán)境的配置文件
在日常開發(fā)中,通常會(huì)使用至少三個(gè)不同的環(huán)境:開發(fā)環(huán)境(dev)、測試環(huán)境(test)和生產(chǎn)環(huán)境(prod);每個(gè)環(huán)境的配置都不相同,包括數(shù)據(jù)庫、端口、IP 地址等信息;那么如何區(qū)分這些環(huán)境,如何打包呢?
Spring Boot 中提供了很好的多環(huán)境整合支持,可以在打包和運(yùn)行時(shí)自由切換不同的環(huán)境。
為了方便管理不同環(huán)境的配置,可以將它們放在不同的配置文件中,此時(shí)我們就需要?jiǎng)?chuàng)建不同環(huán)境的配置文件了,例如 application-dev.properties
、 application-test.properties
和 application-prod.properties
。
需要注意的是,配置文件的命名必須遵循 application-name.properties
或 application-name.yml
的格式,其中的 name
可以自定義,用于區(qū)分不同的環(huán)境。
因此,在整個(gè)項(xiàng)目中,需要有四個(gè)配置文件,包括 application.properties
(主配置文件,是必須存在的)和三個(gè)不同環(huán)境的配置文件。
此時(shí)創(chuàng)建了各個(gè)環(huán)境的配置文件條件下,還需要告訴 SpringBoot 你要運(yùn)行哪個(gè)環(huán)境,主要有兩種指定方式。
??方式1:在主配置文件中指定
可以在主配置文件( application.properties
或者 application.yml
)中指定,內(nèi)容如下:
# 指定運(yùn)行環(huán)境為測試環(huán)境(application.properties) spring.profiles.active=test # 指定運(yùn)行環(huán)境為生產(chǎn)環(huán)境(application.xml) spring: profiles: active: pord
此時(shí),SpringBoot 首先默認(rèn)會(huì)加載application.properties
文件,而這個(gè)的文件配置又告訴 SpringBoot 去找指定環(huán)境的配置文件。
??方式2:運(yùn)行 jar 的時(shí)候指定
SpringBoot 內(nèi)置的環(huán)境切換能夠在運(yùn)行Jar
包的時(shí)候指定環(huán)境,命令如下:
java -jar xxx.jar --spring.profiles.active=test
到此這篇關(guān)于SpringBoot的配置文件(properties與yml)使用方法的文章就介紹到這了,更多相關(guān)SpringBoot配置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot如何獲取yaml/yml(或properties)配置文件信息
- SpringBoot如何配置文件properties和yml
- SpringBoot中application.properties、application.yaml、application.yml區(qū)別
- springboot之Duration(java.time.Duration)在yml properties中的配置方式
- SpringBoot中application.properties與application.yml區(qū)別小結(jié)
- SpringBoot中properties,yml,yaml的區(qū)別及使用說明
相關(guān)文章
mybatisplus?實(shí)現(xiàn)接口MetaObjectHandler自動(dòng)填充字段值
MetaObjectHandler是MyBatis-Plus提供的一個(gè)接口,本文主要介紹了mybatisplus?實(shí)現(xiàn)接口MetaObjectHandler自動(dòng)填充字段值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07Java將RTF文檔轉(zhuǎn)換為Word/PDF/HTML/圖片
RTF文檔因其跨平臺(tái)兼容性而廣泛使用,但有時(shí)在不同的應(yīng)用場景可能需要特定的文檔格式,所以本文來講講如何通過Java將RTF轉(zhuǎn)換為Word/PDF/HTML和圖片格式2025-01-01java中的Consumer、Supply如何實(shí)現(xiàn)多參數(shù)?
Java的Consumer接口只能接受一個(gè)參數(shù),但可以通過自定義接口、使用Tuple或嵌套結(jié)構(gòu)來實(shí)現(xiàn)對(duì)多個(gè)參數(shù)的處理,對(duì)于Supplier接口,它不能接受參數(shù),但可以通過自定義BiSupplier、結(jié)合Function或封裝參數(shù)為對(duì)象來實(shí)現(xiàn)對(duì)兩個(gè)參數(shù)并返回一個(gè)值的功能2024-11-11java實(shí)現(xiàn)附件預(yù)覽(openoffice+swftools+flexpaper)實(shí)例
本篇文章主要介紹了java實(shí)現(xiàn)附件預(yù)覽(openoffice+swftools+flexpaper)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-10-10springboot接收日期字符串參數(shù)與返回日期字符串類型格式化
這篇文章主要介紹了springboot接收日期字符串參數(shù)與返回日期字符串類型格式化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01vue數(shù)據(jù)響應(yīng)式原理重寫函數(shù)實(shí)現(xiàn)數(shù)組響應(yīng)式監(jiān)聽
Vue的通過數(shù)據(jù)劫持的方式實(shí)現(xiàn)數(shù)據(jù)的雙向綁定,即使用Object.defineProperty()來實(shí)現(xiàn)對(duì)屬性的劫持,但是Object.defineProperty()中的setter是無法直接實(shí)現(xiàn)數(shù)組中值的改變的劫持行為的,需要的朋友可以參考下2023-05-05