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è)可讀性?,寫法簡(jiǎn)單、易于理解,它的語法和 JSON 語?類似。
- yml ?持更多的數(shù)據(jù)類型,它可以簡(jiǎn)單表達(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)、測(cè)試環(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)境為測(cè)試環(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)文章
使用EasyExcel根據(jù)模板導(dǎo)出文件方式
本文基于EasyExcel庫開發(fā)ExportUtil工具類,支持模板化導(dǎo)出、列表/離散數(shù)據(jù)填充、HTTP響應(yīng)自動(dòng)配置及異常統(tǒng)一處理,實(shí)現(xiàn)結(jié)構(gòu)化報(bào)表生成與文件下載功能2025-03-03
Mybatis Order by動(dòng)態(tài)參數(shù)防注入方式
這篇文章主要介紹了Mybatis Order by動(dòng)態(tài)參數(shù)防注入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
Spring異常實(shí)現(xiàn)統(tǒng)一處理的方法
這篇文章主要介紹了Spring異常實(shí)現(xiàn)統(tǒng)一處理的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12
新手小白入門必學(xué)JAVA面向?qū)ο笾鄳B(tài)
說到多態(tài),一定離不開其它兩大特性:封裝和繼承,下面這篇文章主要給大家介紹了關(guān)于新手小白入門必學(xué)JAVA面向?qū)ο笾鄳B(tài)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
Java中動(dòng)態(tài)地改變數(shù)組長(zhǎng)度及數(shù)組轉(zhuǎn)Map的代碼實(shí)例分享
這篇文章主要介紹了Java中動(dòng)態(tài)地改變數(shù)組長(zhǎng)度及數(shù)組轉(zhuǎn)map的代碼分享,其中轉(zhuǎn)Map利用到了java.util.Map接口,需要的朋友可以參考下2016-03-03

