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