Spring?Boot?配置文件之類型、加載順序與最佳實(shí)踐記錄
Spring Boot 配置文件詳解
Spring Boot 是一個(gè)基于 Java 的快速開(kāi)發(fā)框架,它通過(guò)自動(dòng)化配置和簡(jiǎn)化設(shè)置,使開(kāi)發(fā)者能夠更專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。配置文件是 Spring Boot 應(yīng)用配置的核心,通過(guò)它我們可以輕松地調(diào)整應(yīng)用的運(yùn)行環(huán)境、功能參數(shù)等。本文將詳細(xì)介紹 Spring Boot 配置文件的使用方法、常見(jiàn)場(chǎng)景及注意事項(xiàng)。
很多項(xiàng)目或者框架的配置信息也放在配置文件中, 比如:
• 項(xiàng)目的啟動(dòng)端口
• 數(shù)據(jù)庫(kù)的連接信息(包含用戶名和密碼的設(shè)置)
• 第三方系統(tǒng)的調(diào)用密鑰等信息
• 用于發(fā)現(xiàn)和定位問(wèn)題的普通日志和異常日志等.
一、Spring Boot 配置文件類型
Spring Boot 支持兩種主要的配置文件類型:
1.1 application.properties(屬性文件)
properties 配置?件是最早期的配置?件格式,也是創(chuàng)建 SpringBoot 項(xiàng)目默認(rèn)的配置文件。
- 以鍵值對(duì)的形式存儲(chǔ)配置信息,簡(jiǎn)單易讀。
- 適合小型項(xiàng)目或者簡(jiǎn)單的配置場(chǎng)景。
properties 是以鍵值的形式配置的,key 和 value 之間是以"="連接的。
示例:
在之前的文章當(dāng)中,啟動(dòng)時(shí)用的端口號(hào)是8080,可以通過(guò)配置文件來(lái)更改端口號(hào):
# 配置項(xiàng)目端?號(hào) server.port=9090
1.2 application.yml(YAML文件)
- 使用 YAML 格式,結(jié)構(gòu)清晰,適合復(fù)雜的配置場(chǎng)景。
- 支持層級(jí)結(jié)構(gòu)和多環(huán)境配置,功能更強(qiáng)大。
示例:
# 配置項(xiàng)目端?號(hào) server: port: 8080
二、application.properties 和 application.yml 的優(yōu)缺點(diǎn)分析
1. application.properties
1.1 優(yōu)點(diǎn)
- 簡(jiǎn)單易學(xué): 基于鍵值對(duì)的形式,語(yǔ)法簡(jiǎn)單,易于理解和使用,適合新手快速上手。
- 輕量級(jí):文件體積小,適合小型項(xiàng)目或簡(jiǎn)單的配置需求。
- 無(wú)需額外依賴:Spring Boot 默認(rèn)支持.properties 文件,無(wú)需引入其他依賴。
- 錯(cuò)誤提示:-在IDE中,.properties 文件的錯(cuò)誤提示相對(duì)友好,開(kāi)發(fā)者可以快速定位問(wèn)題。
- 歷史傳統(tǒng):具有較長(zhǎng)的歷史,許多開(kāi)發(fā)者已經(jīng)熟悉其語(yǔ)法和使用方式。
1.2 缺點(diǎn)
- 層級(jí)結(jié)構(gòu)不足:無(wú)法直接通過(guò)縮進(jìn)來(lái)表示層級(jí)關(guān)系,復(fù)雜配置時(shí)顯得冗雜。 需要通過(guò)“.”來(lái)分隔層級(jí),容易導(dǎo)致配置項(xiàng)過(guò)長(zhǎng)。
- 不支持復(fù)雜數(shù)據(jù)類型:無(wú)法直接配置集合、列表等復(fù)雜數(shù)據(jù)類型。如果需要配置集合,需要通過(guò)逗號(hào)分隔,語(yǔ)法相對(duì)繁瑣。
- 可讀性差:對(duì)于復(fù)雜配置,.properties 文件的可讀性較差,難以快速理解配置結(jié)構(gòu)。
- 配置項(xiàng)冗長(zhǎng):對(duì)于需要層次結(jié)構(gòu)的配置,.properties 文件會(huì)顯得過(guò)于冗長(zhǎng)。
2. application.yml
2.1 優(yōu)點(diǎn)
- 層次結(jié)構(gòu)清晰:使用 YAML 格式,通過(guò)縮進(jìn)表示層級(jí)關(guān)系,配置文件結(jié)構(gòu)清晰,易于理解。適合復(fù)雜配置場(chǎng)景,能夠直觀地表達(dá)配置之間的關(guān)系。
- 支持復(fù)雜數(shù)據(jù)類型:支持列表、字典等復(fù)雜數(shù)據(jù)類型,配置更加靈活??梢灾苯釉谂渲梦募卸x數(shù)組、映射等結(jié)構(gòu)。
- 可讀性強(qiáng):對(duì)于復(fù)雜的配置場(chǎng)景,YAML 文件的可讀性遠(yuǎn)超 .properties 文件。通過(guò)層次結(jié)構(gòu),可以快速定位配置項(xiàng)。
- 多環(huán)境配置便捷: YAML 文件支持多環(huán)境配置,通過(guò)不同的文件后綴(如 application-dev.yml)輕松實(shí)現(xiàn)環(huán)境隔離。
- 與 Docker.deltaTime 兼容:YAML 格式與 Docker 的配置文件格式類似,方便在微服務(wù)場(chǎng)景下使用。
2.2 缺點(diǎn)
- 語(yǔ)法要求嚴(yán)格:YAML 文件的縮進(jìn)、空格等格式要求非常嚴(yán)格,稍有不慎會(huì)導(dǎo)致配置加載失敗。對(duì)于新手來(lái)說(shuō),需要花時(shí)間學(xué)習(xí) YAML 的語(yǔ)法規(guī)則。
- 對(duì)大型配置文件的性能影響:由于 YAML 文件的復(fù)雜性,加載和解析大型配置文件可能會(huì)帶來(lái)一定的性能開(kāi)銷。
- 依賴snakeyaml庫(kù):Spring Boot 的 YAML 配置文件依賴于 snakeyaml 庫(kù),需要額外引入依賴。
- 敏感信息處理復(fù)雜:在 YAML 文件中處理敏感信息(如密碼)需要額外的配置和加密,操作相對(duì)復(fù)雜。
3. 對(duì)比分析
特性 | application.properties | application.yml |
---|---|---|
可讀性 | 簡(jiǎn)單配置可讀性高,但復(fù)雜配置可讀性較差 | 無(wú)論簡(jiǎn)單還是復(fù)雜配置,層次結(jié)構(gòu)清晰,可讀性強(qiáng) |
層次結(jié)構(gòu) | 無(wú)法通過(guò)格式表示層次結(jié)構(gòu),需通過(guò)“.”分隔 | 支持層次結(jié)構(gòu),通過(guò)縮進(jìn)表示 |
復(fù)雜數(shù)據(jù)類型 | 不支持直接配置復(fù)雜數(shù)據(jù)類型 | 支持列表、字典等復(fù)雜數(shù)據(jù)類型 |
語(yǔ)法復(fù)雜性 | 語(yǔ)法簡(jiǎn)單,無(wú)需學(xué)習(xí)額外的格式 | 語(yǔ)法較復(fù)雜,需要學(xué)習(xí) YAML 的基礎(chǔ)知識(shí) |
性能 | 解析速度快,性能開(kāi)銷小 | 對(duì)于大型配置文件,解析速度較慢,性能開(kāi)銷大 |
多環(huán)境配置 | 支持多環(huán)境配置,但實(shí)現(xiàn)相對(duì)繁瑣 | 多環(huán)境配置實(shí)現(xiàn)簡(jiǎn)單,通過(guò)文件后綴即可輕松切換 |
開(kāi)發(fā)成本 | 開(kāi)發(fā)成本低,適合簡(jiǎn)單項(xiàng)目 | 開(kāi)發(fā)成本稍高,但在復(fù)雜項(xiàng)目中更高效 |
4. 使用建議
- 選擇
application.properties
的場(chǎng)景:- 項(xiàng)目配置較為簡(jiǎn)單,不需要復(fù)雜的層次結(jié)構(gòu)。
- 開(kāi)發(fā)團(tuán)隊(duì)對(duì) YAML 格式不熟悉,希望快速上手。
- 需要快速Prototype(原型開(kāi)發(fā)),不希望花費(fèi)時(shí)間在配置文件格式上。
選擇 application.yml
的場(chǎng)景:
- 項(xiàng)目配置復(fù)雜,需要清晰的層次結(jié)構(gòu)。
- 需要配置復(fù)雜數(shù)據(jù)類型(如列表、字典等)。
- 項(xiàng)目需要多環(huán)境配置,希望通過(guò)簡(jiǎn)單的方式實(shí)現(xiàn)環(huán)境切換。
- 項(xiàng)目團(tuán)隊(duì)熟悉 YAML 格式,能夠快速上手。
5. 示例對(duì)比
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)目中,想要主動(dòng)的讀取配置文件中的內(nèi)容,可以使用 @Value 注解來(lái)實(shí)現(xiàn)。@Value 注解使用" ${} "的格式讀取
3.1properties配置的讀取
properties
配置文件:
#端口號(hào) server.port=9090 #項(xiàng)目名稱 spring.application.name=spring-boot-demo #讀取這個(gè)配置文件 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); } }
啟動(dòng)項(xiàng)目:用瀏覽器打開(kāi) http:127.0.0.1:9090/Mylove/Mylove
:
可以看到讀取到了配置文件的值。
3.2yml配置的讀取
yml
配置文件:
#端口號(hào) server: port=9090 #項(xiàng)目名稱 spring: application: name: spring-boot-demo #配置項(xiàng)目文件 Mylove: key1: you1
同理如上:
啟動(dòng)項(xiàng)目:
可以看到讀取yml配置文件的值成功了。
再舉幾個(gè)讀取yml配置的例子:
配置對(duì)象
#端口號(hào) server: port=9090 #項(xiàng)目名稱 spring: application: name: spring-boot-demo #配置對(duì)象 student: name: 張三 age: 18
這個(gè)時(shí)候就不能用
@Value
來(lái)讀取配置中的對(duì)象了,此時(shí)要使?另?個(gè)注解@ConfigurationProperties
來(lái)讀取,具體實(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(); } }
啟動(dòng):
@SpringBootApplication public class SpringBootDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringBootDemoApplication.class, args); } }
訪問(wèn)http:127.0.0.1:9090/yml/test
:
配置集合
#端口號(hào) server: port=9090 #項(xiàng)目名稱 spring: application: name: spring-boot-demo #配置集合 types: name: - mysql - sqlserver - db2
補(bǔ)充代碼進(jìn)行觀察測(cè)試:
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(); } }
啟動(dòng):
@SpringBootApplication public class SpringBootDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringBootDemoApplication.class, args); } }
訪問(wèn):http://127.0.0.1:9090/yml/test
四、 配置文件的加載順序
Spring Boot 配置文件的加載順序如下:
當(dāng)前目錄下的 config
目錄:優(yōu)先級(jí)最高。
當(dāng)前目錄下的配置文件:如application.yml
或application.properties
。
類路徑下的 config
包:用于包內(nèi)的配置。
類路徑下的配置文件:如application.yml
或application.properties
。
通過(guò)合理規(guī)劃配置文件的位置,可以實(shí)現(xiàn)環(huán)境隔離和配置管理。
提出問(wèn)題:
當(dāng)yml配置文件
和properties配置文件
同時(shí)存在,那么哪個(gè)優(yōu)先級(jí)在前面呢?
我們用個(gè)簡(jiǎn)單的例子進(jìn)行測(cè)試:
yml配置文件
#端口號(hào) server: port=9090
properties配置文件
#端口號(hào) server.port=8080
我們啟動(dòng)項(xiàng)目看用的是哪個(gè)端口號(hào):
可以看到用的是8080這個(gè)端口號(hào),可見(jiàn)當(dāng)他們兩個(gè)這個(gè)配置文件同時(shí)存在時(shí)候,properties配置文件的優(yōu)先級(jí)更加高。
五、 多環(huán)境配置
在實(shí)際開(kāi)發(fā)中,我們通常需要針對(duì)不同環(huán)境(如開(kāi)發(fā)、測(cè)試、生產(chǎn))配置不同的參數(shù)。Spring Boot 支持通過(guò)配置文件后綴來(lái)實(shí)現(xiàn)多環(huán)境配置。
5.1 配置文件命名規(guī)則
配置文件可以通過(guò)添加環(huán)境名稱作為后綴,創(chuàng)建多個(gè)環(huán)境配置文件:
application.yml
:默認(rèn)配置文件。application-dev.yml
:開(kāi)發(fā)環(huán)境配置。application-test.yml
:測(cè)試環(huán)境配置。application-prod.yml
:生產(chǎn)環(huán)境配置。
5.2 激活環(huán)境
可以通過(guò)以下方式激活特定環(huán)境:
1. 命令行參數(shù)
在啟動(dòng)應(yīng)用時(shí),通過(guò) --spring.profiles.active
參數(shù)指定環(huán)境:
java -jar --spring.profiles.active=dev myapp.jar
2. 配置文件激活
在 application.yml
文件中直接配置激活環(huán)境:
spring: profiles: active: dev
六、 常用配置示例
以下是一些常見(jiàn)的配置場(chǎng)景示例:
6.1 服務(wù)器配置
server: port: 8080 servlet: context-path: /myapp
6.2 數(shù)據(jù)庫(kù)配置
spring: datasource: url: jdbc:mysql://localhost:3306/testdb username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver
6.3 日志配置
logging: level: INFO file: name: logs/myapp.log
6.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)
- 配置文件的位置:盡量避免將配置文件放在多個(gè)目錄中,以免引發(fā)配置沖突。
- 環(huán)境隔離:不同環(huán)境的配置文件要明確區(qū)分,避免生產(chǎn)環(huán)境配置錯(cuò)誤。
- 敏感信息:不要直接在配置文件中硬編碼敏感信息(如密碼),建議使用外部配置或加密方式。
- 文件格式:YAML 文件的縮進(jìn)和格式尤為重要,格式錯(cuò)誤可能導(dǎo)致應(yīng)用啟動(dòng)失敗。
八、配置文件的加載位置
除了默認(rèn)的配置文件外,Spring Boot 還支持從以下位置加載配置文件:
外部文件目錄:通過(guò) --spring.config.location
參數(shù)指定。
java -jar --spring.config.location=/path/to/config/ myapp.jar
內(nèi)部類路徑:將配置文件放在 src/main/resources
目錄下。
外部配置中心:結(jié)合 Spring Cloud Config 使用外部配置中心。
九、高級(jí)主題
9.1 配置文件的優(yōu)先級(jí)
配置文件的加載順序決定了配置的優(yōu)先級(jí),后加載的配置會(huì)覆蓋前面的配置。
加載順序 | 配置文件路徑 |
---|---|
1 | file:./config/ |
2 | file:./ |
3 | classpath:config/ |
4 | classpath: |
9.2 動(dòng)態(tài)更新配置
Spring Boot 提供了.DynamicPropertySource功能,可以實(shí)現(xiàn)配置的熱更新。
9.3 使用隨機(jī)端口
通過(guò)配置 server.port=0
可以讓服務(wù)器隨機(jī)分配端口。
十、 總結(jié)
Spring Boot 的配置文件是靈活且強(qiáng)大的工具,通過(guò)合理的配置管理,可以讓應(yīng)用開(kāi)發(fā)和部署更加高效。無(wú)論是簡(jiǎn)單的屬性配置,還是復(fù)雜的多環(huán)境管理,Spring Boot 都提供了便捷的解決方案。在后續(xù)的學(xué)習(xí)中,可以深入探索 Spring Boot 的其他配置高級(jí)功能,如動(dòng)態(tài)配置更新、配置文件加密等。
希望本文對(duì)你理解Spring Boot 配置文件有所幫助!如果有更多問(wèn)題,歡迎留言討論。
到此這篇關(guān)于Spring Boot 配置文件之類型、加載順序與最佳實(shí)踐記錄的文章就介紹到這了,更多相關(guān)Spring Boot 類型、加載順序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA新建bootstrap.yml文件不顯示葉子圖標(biāo)的問(wèn)題
這篇文章主要介紹了IDEA新建bootstrap.yml文件不顯示葉子圖標(biāo)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07解析web.xml中在Servlet中獲取context-param和init-param內(nèi)的參數(shù)
本篇文章是對(duì)web.xml中在Servlet中獲取context-param和init-param內(nèi)的參數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07RocketMQ的消費(fèi)者類型與最佳實(shí)踐詳解
這篇文章主要介紹了RocketMQ的消費(fèi)者類型與最佳實(shí)踐詳解,在?RocketMQ?5.0?中,更加強(qiáng)調(diào)了客戶端類型的概念,尤其是消費(fèi)者類型,為了滿足多樣的?RocketMQ?中一共有三種不同的消費(fèi)者類型,分別是?PushConsumer、SimpleConsumer?和?PullConsumer,需要的朋友可以參考下2023-10-10springMVC如何將controller中Model數(shù)據(jù)傳遞到j(luò)sp頁(yè)面
本篇文章主要介紹了springMVC如何將controller中Model數(shù)據(jù)傳遞到j(luò)sp頁(yè)面,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07java設(shè)計(jì)模式學(xué)習(xí)之簡(jiǎn)單工廠模式
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式學(xué)習(xí)之簡(jiǎn)單工廠模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10解決Springboot獲取不到nacos配置中心的配置問(wèn)題
由于項(xiàng)目使用的nacos老版本,存在風(fēng)險(xiǎn)bug, 需要將nacos升級(jí)至2.2.1及以上版本,版本升級(jí)完畢之后 啟動(dòng)項(xiàng)目發(fā)現(xiàn)項(xiàng)目開(kāi)始報(bào)錯(cuò),所以本文記錄一下Springboot獲取不到nacos配置中心的配置問(wèn)題,文中有詳細(xì)的解決方法,需要的朋友可以參考下2023-09-09Java實(shí)現(xiàn)多級(jí)表頭和復(fù)雜表頭的導(dǎo)出功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多級(jí)表頭和復(fù)雜表頭的導(dǎo)出功能的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03