Spring?Boot?配置文件之類型、加載順序與最佳實(shí)踐記錄
Spring Boot 配置文件詳解
Spring Boot 是一個基于 Java 的快速開發(fā)框架,它通過自動化配置和簡化設(shè)置,使開發(fā)者能夠更專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。配置文件是 Spring Boot 應(yīng)用配置的核心,通過它我們可以輕松地調(diào)整應(yīng)用的運(yùn)行環(huán)境、功能參數(shù)等。本文將詳細(xì)介紹 Spring Boot 配置文件的使用方法、常見場景及注意事項(xiàng)。
很多項(xiàng)目或者框架的配置信息也放在配置文件中, 比如:
• 項(xiàng)目的啟動端口
• 數(shù)據(jù)庫的連接信息(包含用戶名和密碼的設(shè)置)
• 第三方系統(tǒng)的調(diào)用密鑰等信息
• 用于發(fā)現(xiàn)和定位問題的普通日志和異常日志等.
一、Spring Boot 配置文件類型
Spring Boot 支持兩種主要的配置文件類型:
1.1 application.properties(屬性文件)
properties 配置?件是最早期的配置?件格式,也是創(chuàng)建 SpringBoot 項(xiàng)目默認(rèn)的配置文件。
- 以鍵值對的形式存儲配置信息,簡單易讀。
- 適合小型項(xiàng)目或者簡單的配置場景。
properties 是以鍵值的形式配置的,key 和 value 之間是以"="連接的。
示例:
在之前的文章當(dāng)中,啟動時用的端口號是8080,可以通過配置文件來更改端口號:
# 配置項(xiàng)目端?號 server.port=9090

1.2 application.yml(YAML文件)
- 使用 YAML 格式,結(jié)構(gòu)清晰,適合復(fù)雜的配置場景。
- 支持層級結(jié)構(gòu)和多環(huán)境配置,功能更強(qiáng)大。
示例:
# 配置項(xiàng)目端?號 server: port: 8080
二、application.properties 和 application.yml 的優(yōu)缺點(diǎn)分析
1. application.properties
1.1 優(yōu)點(diǎn)
- 簡單易學(xué): 基于鍵值對的形式,語法簡單,易于理解和使用,適合新手快速上手。
- 輕量級:文件體積小,適合小型項(xiàng)目或簡單的配置需求。
- 無需額外依賴:Spring Boot 默認(rèn)支持.properties 文件,無需引入其他依賴。
- 錯誤提示:-在IDE中,.properties 文件的錯誤提示相對友好,開發(fā)者可以快速定位問題。
- 歷史傳統(tǒng):具有較長的歷史,許多開發(fā)者已經(jīng)熟悉其語法和使用方式。
1.2 缺點(diǎn)
- 層級結(jié)構(gòu)不足:無法直接通過縮進(jìn)來表示層級關(guān)系,復(fù)雜配置時顯得冗雜。 需要通過“.”來分隔層級,容易導(dǎo)致配置項(xiàng)過長。
- 不支持復(fù)雜數(shù)據(jù)類型:無法直接配置集合、列表等復(fù)雜數(shù)據(jù)類型。如果需要配置集合,需要通過逗號分隔,語法相對繁瑣。
- 可讀性差:對于復(fù)雜配置,.properties 文件的可讀性較差,難以快速理解配置結(jié)構(gòu)。
- 配置項(xiàng)冗長:對于需要層次結(jié)構(gòu)的配置,.properties 文件會顯得過于冗長。
2. application.yml
2.1 優(yōu)點(diǎn)
- 層次結(jié)構(gòu)清晰:使用 YAML 格式,通過縮進(jìn)表示層級關(guān)系,配置文件結(jié)構(gòu)清晰,易于理解。適合復(fù)雜配置場景,能夠直觀地表達(dá)配置之間的關(guān)系。
- 支持復(fù)雜數(shù)據(jù)類型:支持列表、字典等復(fù)雜數(shù)據(jù)類型,配置更加靈活。可以直接在配置文件中定義數(shù)組、映射等結(jié)構(gòu)。
- 可讀性強(qiáng):對于復(fù)雜的配置場景,YAML 文件的可讀性遠(yuǎn)超 .properties 文件。通過層次結(jié)構(gòu),可以快速定位配置項(xiàng)。
- 多環(huán)境配置便捷: YAML 文件支持多環(huán)境配置,通過不同的文件后綴(如 application-dev.yml)輕松實(shí)現(xiàn)環(huán)境隔離。
- 與 Docker.deltaTime 兼容:YAML 格式與 Docker 的配置文件格式類似,方便在微服務(wù)場景下使用。
2.2 缺點(diǎn)
- 語法要求嚴(yán)格:YAML 文件的縮進(jìn)、空格等格式要求非常嚴(yán)格,稍有不慎會導(dǎo)致配置加載失敗。對于新手來說,需要花時間學(xué)習(xí) YAML 的語法規(guī)則。
- 對大型配置文件的性能影響:由于 YAML 文件的復(fù)雜性,加載和解析大型配置文件可能會帶來一定的性能開銷。
- 依賴snakeyaml庫:Spring Boot 的 YAML 配置文件依賴于 snakeyaml 庫,需要額外引入依賴。
- 敏感信息處理復(fù)雜:在 YAML 文件中處理敏感信息(如密碼)需要額外的配置和加密,操作相對復(fù)雜。
3. 對比分析
| 特性 | application.properties | application.yml |
|---|---|---|
| 可讀性 | 簡單配置可讀性高,但復(fù)雜配置可讀性較差 | 無論簡單還是復(fù)雜配置,層次結(jié)構(gòu)清晰,可讀性強(qiáng) |
| 層次結(jié)構(gòu) | 無法通過格式表示層次結(jié)構(gòu),需通過“.”分隔 | 支持層次結(jié)構(gòu),通過縮進(jìn)表示 |
| 復(fù)雜數(shù)據(jù)類型 | 不支持直接配置復(fù)雜數(shù)據(jù)類型 | 支持列表、字典等復(fù)雜數(shù)據(jù)類型 |
| 語法復(fù)雜性 | 語法簡單,無需學(xué)習(xí)額外的格式 | 語法較復(fù)雜,需要學(xué)習(xí) YAML 的基礎(chǔ)知識 |
| 性能 | 解析速度快,性能開銷小 | 對于大型配置文件,解析速度較慢,性能開銷大 |
| 多環(huán)境配置 | 支持多環(huán)境配置,但實(shí)現(xiàn)相對繁瑣 | 多環(huán)境配置實(shí)現(xiàn)簡單,通過文件后綴即可輕松切換 |
| 開發(fā)成本 | 開發(fā)成本低,適合簡單項(xiàng)目 | 開發(fā)成本稍高,但在復(fù)雜項(xiàng)目中更高效 |
4. 使用建議
- 選擇
application.properties的場景:- 項(xiàng)目配置較為簡單,不需要復(fù)雜的層次結(jié)構(gòu)。
- 開發(fā)團(tuán)隊(duì)對 YAML 格式不熟悉,希望快速上手。
- 需要快速Prototype(原型開發(fā)),不希望花費(fèi)時間在配置文件格式上。
選擇 application.yml 的場景:
- 項(xiàng)目配置復(fù)雜,需要清晰的層次結(jié)構(gòu)。
- 需要配置復(fù)雜數(shù)據(jù)類型(如列表、字典等)。
- 項(xiàng)目需要多環(huán)境配置,希望通過簡單的方式實(shí)現(xiàn)環(huán)境切換。
- 項(xiàng)目團(tuán)隊(duì)熟悉 YAML 格式,能夠快速上手。
5. 示例對比
5.1 application.properties 示例
server.port=8080 server.servlet.context-path=/myapp spring.datasource.url=jdbc:mysql://localhost:3306/testdb spring.datasource.username=root spring.datasource.password=123456 myconfig.appName=My Spring Boot App myconfig.version=1.0.0
5.2 application.yml 示例
server:
port: 8080
servlet:
context-path: /myapp
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb
username: root
password: 123456
myconfig:
appName: My Spring Boot App
version: 1.0.0從上述示例可以看出,
application.yml的配置文件結(jié)構(gòu)更清晰,層次更分明,易于理解和維護(hù)。
三、yml配置和properties配置的讀取
如果在項(xiàng)目中,想要主動的讀取配置文件中的內(nèi)容,可以使用 @Value 注解來實(shí)現(xiàn)。@Value 注解使用" ${} "的格式讀取
3.1properties配置的讀取
properties配置文件:
#端口號 server.port=9090 #項(xiàng)目名稱 spring.application.name=spring-boot-demo #讀取這個配置文件 Mylove.key=you
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("Mylove")
public class MyController {
@Value("${Mylove.key}")
private String key;
@RequestMapping("getMylove")
public String ggetMylove() {
return "讀取到配置文件的值:"+key;
}
}@SpringBootApplication
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}啟動項(xiàng)目:用瀏覽器打開 http:127.0.0.1:9090/Mylove/Mylove :

可以看到讀取到了配置文件的值。
3.2yml配置的讀取
yml配置文件:
#端口號
server:
port=9090
#項(xiàng)目名稱
spring:
application:
name: spring-boot-demo
#配置項(xiàng)目文件
Mylove:
key1: you1同理如上:
啟動項(xiàng)目:

可以看到讀取yml配置文件的值成功了。
再舉幾個讀取yml配置的例子:
配置對象
#端口號
server:
port=9090
#項(xiàng)目名稱
spring:
application:
name: spring-boot-demo
#配置對象
student:
name: 張三
age: 18這個時候就不能用
@Value來讀取配置中的對象了,此時要使?另?個注解@ConfigurationProperties來讀取,具體實(shí)現(xiàn)如下:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
private String name;
private int age;
}import com.slivqers.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("yml")
public class SpringBootController {
@Autowired
private Student student;
@RequestMapping("test")
private String GetSpringBoot(){
return student.toString();
}
}啟動:
@SpringBootApplication
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}訪問http:127.0.0.1:9090/yml/test :

配置集合
#端口號
server:
port=9090
#項(xiàng)目名稱
spring:
application:
name: spring-boot-demo
#配置集合
types:
name:
- mysql
- sqlserver
- db2補(bǔ)充代碼進(jìn)行觀察測試:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ConfigurationProperties(prefix = "types")
@Data
public class Lists{
private List<String> name ;
}import com.slivqers.model.Lists;
import com.slivqers.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("yml")
public class SpringBootController {
@Autowired
private Lists list;
@RequestMapping("test")
private String GetSpringBoot(){
return list.toString();
}
}啟動:
@SpringBootApplication
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}訪問:http://127.0.0.1:9090/yml/test

四、 配置文件的加載順序
Spring Boot 配置文件的加載順序如下:
當(dāng)前目錄下的 config 目錄:優(yōu)先級最高。
當(dāng)前目錄下的配置文件:如application.yml或application.properties。
類路徑下的 config 包:用于包內(nèi)的配置。
類路徑下的配置文件:如application.yml或application.properties。
通過合理規(guī)劃配置文件的位置,可以實(shí)現(xiàn)環(huán)境隔離和配置管理。
提出問題:
當(dāng)yml配置文件和properties配置文件同時存在,那么哪個優(yōu)先級在前面呢?
我們用個簡單的例子進(jìn)行測試:
yml配置文件
#端口號 server: port=9090
properties配置文件
#端口號 server.port=8080
我們啟動項(xiàng)目看用的是哪個端口號:

可以看到用的是8080這個端口號,可見當(dāng)他們兩個這個配置文件同時存在時候,properties配置文件的優(yōu)先級更加高。
五、 多環(huán)境配置
在實(shí)際開發(fā)中,我們通常需要針對不同環(huán)境(如開發(fā)、測試、生產(chǎn))配置不同的參數(shù)。Spring Boot 支持通過配置文件后綴來實(shí)現(xiàn)多環(huán)境配置。
5.1 配置文件命名規(guī)則
配置文件可以通過添加環(huán)境名稱作為后綴,創(chuàng)建多個環(huán)境配置文件:
application.yml:默認(rèn)配置文件。application-dev.yml:開發(fā)環(huán)境配置。application-test.yml:測試環(huán)境配置。application-prod.yml:生產(chǎn)環(huán)境配置。
5.2 激活環(huán)境
可以通過以下方式激活特定環(huán)境:
1. 命令行參數(shù)
在啟動應(yīng)用時,通過 --spring.profiles.active 參數(shù)指定環(huán)境:
java -jar --spring.profiles.active=dev myapp.jar
2. 配置文件激活
在 application.yml 文件中直接配置激活環(huán)境:
spring:
profiles:
active: dev六、 常用配置示例
以下是一些常見的配置場景示例:
6.1 服務(wù)器配置
server:
port: 8080
servlet:
context-path: /myapp6.2 數(shù)據(jù)庫配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver6.3 日志配置
logging:
level: INFO
file:
name: logs/myapp.log6.4 自定義配置屬性
在 application.yml 中添加自定義屬性:
myconfig: appName: My Spring Boot App version: 1.0.0
在代碼中使用自定義屬性:
@Configuration
@Component
public class MyConfig {
@Value("${myconfig.appName}")
private String appName;
public String getAppName() {
return appName;
}
}七、配置文件的注意事項(xiàng)
- 配置文件的位置:盡量避免將配置文件放在多個目錄中,以免引發(fā)配置沖突。
- 環(huán)境隔離:不同環(huán)境的配置文件要明確區(qū)分,避免生產(chǎn)環(huán)境配置錯誤。
- 敏感信息:不要直接在配置文件中硬編碼敏感信息(如密碼),建議使用外部配置或加密方式。
- 文件格式:YAML 文件的縮進(jìn)和格式尤為重要,格式錯誤可能導(dǎo)致應(yīng)用啟動失敗。
八、配置文件的加載位置
除了默認(rèn)的配置文件外,Spring Boot 還支持從以下位置加載配置文件:
外部文件目錄:通過 --spring.config.location 參數(shù)指定。
java -jar --spring.config.location=/path/to/config/ myapp.jar
內(nèi)部類路徑:將配置文件放在 src/main/resources 目錄下。
外部配置中心:結(jié)合 Spring Cloud Config 使用外部配置中心。
九、高級主題
9.1 配置文件的優(yōu)先級
配置文件的加載順序決定了配置的優(yōu)先級,后加載的配置會覆蓋前面的配置。
| 加載順序 | 配置文件路徑 |
|---|---|
| 1 | file:./config/ |
| 2 | file:./ |
| 3 | classpath:config/ |
| 4 | classpath: |
9.2 動態(tài)更新配置
Spring Boot 提供了.DynamicPropertySource功能,可以實(shí)現(xiàn)配置的熱更新。
9.3 使用隨機(jī)端口
通過配置 server.port=0 可以讓服務(wù)器隨機(jī)分配端口。
十、 總結(jié)
Spring Boot 的配置文件是靈活且強(qiáng)大的工具,通過合理的配置管理,可以讓應(yīng)用開發(fā)和部署更加高效。無論是簡單的屬性配置,還是復(fù)雜的多環(huán)境管理,Spring Boot 都提供了便捷的解決方案。在后續(xù)的學(xué)習(xí)中,可以深入探索 Spring Boot 的其他配置高級功能,如動態(tài)配置更新、配置文件加密等。
希望本文對你理解Spring Boot 配置文件有所幫助!如果有更多問題,歡迎留言討論。
到此這篇關(guān)于Spring Boot 配置文件之類型、加載順序與最佳實(shí)踐記錄的文章就介紹到這了,更多相關(guān)Spring Boot 類型、加載順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA新建bootstrap.yml文件不顯示葉子圖標(biāo)的問題
這篇文章主要介紹了IDEA新建bootstrap.yml文件不顯示葉子圖標(biāo)的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
解析web.xml中在Servlet中獲取context-param和init-param內(nèi)的參數(shù)
本篇文章是對web.xml中在Servlet中獲取context-param和init-param內(nèi)的參數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
RocketMQ的消費(fèi)者類型與最佳實(shí)踐詳解
這篇文章主要介紹了RocketMQ的消費(fèi)者類型與最佳實(shí)踐詳解,在?RocketMQ?5.0?中,更加強(qiáng)調(diào)了客戶端類型的概念,尤其是消費(fèi)者類型,為了滿足多樣的?RocketMQ?中一共有三種不同的消費(fèi)者類型,分別是?PushConsumer、SimpleConsumer?和?PullConsumer,需要的朋友可以參考下2023-10-10
springMVC如何將controller中Model數(shù)據(jù)傳遞到j(luò)sp頁面
本篇文章主要介紹了springMVC如何將controller中Model數(shù)據(jù)傳遞到j(luò)sp頁面,具有一定的參考價值,有興趣的可以了解一下2017-07-07
java設(shè)計模式學(xué)習(xí)之簡單工廠模式
這篇文章主要為大家詳細(xì)介紹了java設(shè)計模式學(xué)習(xí)之簡單工廠模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
解決Springboot獲取不到nacos配置中心的配置問題
由于項(xiàng)目使用的nacos老版本,存在風(fēng)險bug, 需要將nacos升級至2.2.1及以上版本,版本升級完畢之后 啟動項(xiàng)目發(fā)現(xiàn)項(xiàng)目開始報錯,所以本文記錄一下Springboot獲取不到nacos配置中心的配置問題,文中有詳細(xì)的解決方法,需要的朋友可以參考下2023-09-09
Java實(shí)現(xiàn)多級表頭和復(fù)雜表頭的導(dǎo)出功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多級表頭和復(fù)雜表頭的導(dǎo)出功能的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03

