?? 前言
本文,我們就要來介紹一下Spring Boot中的配置文件 ,在學(xué)習(xí)了本文之后,可以很清楚地知道如何在Spring Boot中去配置項(xiàng)目的一些系統(tǒng)設(shè)置
一、配置文件的說明
1、什么是配置文件
首先我們先來聊聊什么是配置文件?
-
配置文件是一種 文本文件,通常用于存儲(chǔ)程序的參數(shù)和設(shè)置。它包含了程序運(yùn)行所需的各種選項(xiàng)和配置信息,例如界面風(fēng)格、服務(wù)器連接信息、默認(rèn)語言等。這些信息可以通過
鍵值對(duì)
的形式表示,也可以使用特定的語法和結(jié)構(gòu)
描述更復(fù)雜的配置信息。 -
配置文件通常由 程序在啟動(dòng)時(shí)讀取和解析,以自定義程序的行為。例如,在網(wǎng)站開發(fā)中,網(wǎng)站的配置文件通常包含了數(shù)據(jù)庫連接信息、安全性設(shè)置、日志記錄等重要信息。在操作系統(tǒng)中,配置文件則可以用于指定各種系統(tǒng)參數(shù),如網(wǎng)絡(luò)連接、設(shè)備驅(qū)動(dòng)程序等。
-
配置文件的格式和內(nèi)容因程序而異,常見的配置文件格式包括
INI文件
、XML文件
、JSON文件
等。INI文件是最早的配置文件格式之一,它使用簡單的鍵值對(duì)語法來存儲(chǔ)配置信息。XML和JSON文件則更加靈活和可擴(kuò)展,可以描述更復(fù)雜的配置信息。 -
除了使用傳統(tǒng)的文本編輯器手動(dòng)編寫配置文件外,現(xiàn)在也有許多工具可以幫助用戶輕松地編輯和管理配置文件。例如,一些應(yīng)用程序具有自己的 配置文件編輯器,用戶可以通過界面來直觀地編輯配置信息。另外,一些配置管理工具則可以幫助用戶 自動(dòng)化地管理和維護(hù)配置文件,例如版本控制、備份和恢復(fù)等。
2、配置文件的作用
知道了什么是配置文件之后,我們來看看它的作用有哪些
整個(gè)項(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)鍵?志,所以配置?件的作?是?常重要的?
我們可以來看看配置文件最簡單的功能:修改服務(wù)器的啟動(dòng)端口號(hào) 對(duì)于默認(rèn)的端口我們可以看到是8080
現(xiàn)在我們通過application.properties
這個(gè)Spring Boot的配置文件將其修改為 9090
server.port=9090
然后在修改之后我們?cè)偃?dòng)項(xiàng)目可以發(fā)現(xiàn)端口號(hào)被修改成為9090
?? 如果我們想要訪問這個(gè)項(xiàng)目就不能使用 localhost:8080
了,而要使用 localhost:9090
地址了
3、配置文件的格式
清楚了配置文件的作用之后,我們?cè)賮砜纯此母袷绞窃鯓拥?/p>
Spring Boot 配置?件主要分為以下兩種格式:
.properties
.yml
這就好像連鎖店??的統(tǒng)?服裝?樣,有兩種不同的款式,properties
類型的配置?件就屬于?款“服飾”,也是創(chuàng)建 Spring Boot 項(xiàng)?時(shí)默認(rèn)的?件格式(主要是由于倉庫?還有庫存),? yml
屬于新版款式,如果?戶了解情況直接指定要新款服飾,那么就直接發(fā)給他
那這兩種格式有什么區(qū)別呢?我們來對(duì)比一下看看
-
properties文件
- 出現(xiàn)的比較早
- 出現(xiàn)中文的話出現(xiàn)亂碼的幾率非常大
-
yml文件
- 出現(xiàn)的比較晚
- 對(duì)中文的支持度是比較高
- 在語法上,yml 配置格式相較于 properties 配置格式來說更加的簡潔
-
一些特殊說明
- 理論上講
.properties
可以和.yml
?起存在于?個(gè)項(xiàng)?當(dāng)中,當(dāng) properties 和 yml ?起存在?個(gè)項(xiàng)?中時(shí),如果配置?件中出現(xiàn)了同樣的配置,?如 properties 和 yml 中都配置了“server.port”,那么這個(gè)時(shí)候會(huì) 以 properties 中的配置為主,也就是.properties
配置?件的優(yōu)先級(jí)最?,但加載完.properties
?件之后,也會(huì)加載.yml
?件的配置信息。 - 雖然理論上來講 .properties 可以和 .yml 共存,但實(shí)際的業(yè)務(wù)當(dāng)中,我們通常會(huì)采取?種統(tǒng)?的配置?件格式(只會(huì)選一個(gè)存在),這樣可以更好的維護(hù)(降低故障率)
- 理論上講
二、.properties 配置文件
properties 配置?件是最早期的配置?件格式,也是創(chuàng)建 Spring Boot 項(xiàng)?默認(rèn)的配置?件
1、properties 基本語法
我們先來看看它的基本語法:
- properties 是以鍵值的形式配置的,key 和 value 之間是以
“=”
連接的,如:
# 配置項(xiàng)?端?號(hào)
server.port=8080
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
【小貼士】:
- 我們?cè)谂渲梦募袑懽⑨屖且?code>#開頭的
- 對(duì)于這配置文件里的配置項(xiàng)我們可以去做一個(gè)分類:
- 系統(tǒng)配置項(xiàng),比如
server.port/spring.datasource.url...
—> 系統(tǒng) - 用戶自定義配置(非系統(tǒng)配置項(xiàng))—> key 用戶自定義
- 系統(tǒng)配置項(xiàng),比如
- 配置文件在項(xiàng)目重啟再打開之后可能會(huì)出現(xiàn)亂碼,涉及字符集的問題,這一塊可以看我之前的文章 鏈接
2、讀取配置文件
配置文件在寫好之后不僅僅就好了哦,我們還可以去讀取到里面的內(nèi)容,一起來試試吧??
?? 如果在項(xiàng)?中,想要主動(dòng)的讀取配置?件中的內(nèi)容,可以使? @Value
注解來實(shí)現(xiàn)
# 用戶自定義配置
javaclass=106
- 以下是測試代碼,我們一起來看看結(jié)果
@RestController
public class TestController {
@Value("javaclass")
private String myconfig;
@RequestMapping("/test/sayhi")
public String sayHi(){
return "hello world ->" + myconfig;
}
}
- 可以看到,我們?cè)陧撁嬷蝎@取到的并不是 javaclass 所對(duì)應(yīng)的
value
值,而是key
值,這就使得很多同學(xué)產(chǎn)生了疑惑?
這里我們來談?wù)?code>value值正確的讀取方法:@Value 注解使?
“${}”
的格式讀取
- 也就是要寫成下面這樣的形式??
@Value("${javaclass}") // 一定要是 ${key} 的格式
- 然后我們?cè)賮碓L問讀取一下看看便可以發(fā)現(xiàn)讀取到了對(duì)應(yīng)的
value
值
- 我們?cè)賮碓囋囎x取剛才所修改的讀取服務(wù)器的啟動(dòng)端口
@Value("${server.port}")
3、properties 缺點(diǎn)分析
經(jīng)過上面一系列的查看,我們來對(duì)
properties
這個(gè)格式的文件來分析一下
- 在這之前我們?cè)偃プ鲆粋€(gè)測試,也就是 在properties文件 中寫入中文的
value
值,然后去訪問一下看看會(huì)有什么問題
mytest=測試properties文件
- 然后重啟項(xiàng)目去訪問卻發(fā)現(xiàn)我們并沒有獲取到這幾個(gè)文字,而是出現(xiàn)了亂碼的形式,只有英文
properties
可以看得清楚,而且這是在我的 IDEA配置文件已經(jīng)設(shè)置了UTF-8的字符集之后
然后我們?cè)俑鶕?jù)兩個(gè)不同是配置文件來看看它們之間的書寫區(qū)別
于是我們便觀察到了在properties
文件中存在著很多重復(fù)的內(nèi)容
?? 此時(shí)我們便可以得出properties
文件的兩個(gè)缺陷
- 如果在配置文件中出現(xiàn)中文的話,在訪問時(shí)就會(huì)出現(xiàn)亂碼問題
- properties 配置?件中會(huì)有很多的冗余的信息
三、.yml 配置文件
1、yml文件誕生的背景
那么這個(gè)時(shí)候,就輪到我們的
.yml
文件出場了,我們一起來看看它是怎么誕生的吧??
-
舉一個(gè)很簡單的例子,本專欄我們介紹的是【Spring Boot】,很多學(xué)習(xí)Java的同學(xué)相信一定聽說過【Spring Cloud】,這個(gè)呢就是我們現(xiàn)在業(yè)界所稱的 微服務(wù),其實(shí)在早期 Spring Cloud 沒出來的時(shí)候【Spring Boot】它就是一種微服務(wù),那我們便可以來談?wù)劄槭裁匆形⒎?wù)的出現(xiàn)呢?
-
原因就在于:隨著團(tuán)隊(duì)的變大,不同業(yè)務(wù)部門有相同需求,所以要把原來的功能分成多個(gè)不同的模塊。例如我們一個(gè)教育部門中的教務(wù)管理系統(tǒng),原本在比較小型的時(shí)候之后一兩個(gè)功能,那可以將這些模塊都寫在一起,但是當(dāng)功能慢慢地增多,出現(xiàn)了:
- 用戶中心
- 商城中心
- 積分中心
-
此時(shí)我們就要考慮到微服務(wù)了,將這些模塊作為一個(gè)個(gè)功能給單獨(dú)提取出來,便可以 實(shí)現(xiàn)很好地解耦,減少代碼的維護(hù)成本
-
而且在一個(gè)項(xiàng)目中,我們不僅僅只是使用到一門編程語言,可能會(huì)有多個(gè),那么運(yùn)維在進(jìn)行維護(hù)的時(shí)候,可能會(huì)收到使用不同編程語言所描述的程序,這就會(huì)對(duì)運(yùn)維的要求很高,所以需要一個(gè)通用的配置文件去解決這些問題 —— 此時(shí)就有了
yml
配置文件的誕生
我們來
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 中
2、yml 基本語法
了解了
yml
文件的誕生背景以及其優(yōu)點(diǎn)之后,我們來學(xué)習(xí)一下它的基本語法
- yml 是樹形結(jié)構(gòu)的配置?件,它的基礎(chǔ)語法是
key: value
,注意 key 和 value 之間使?英?冒號(hào)加空格的?式組成的,其中的空格不可省略
我們來看一下它的正確與錯(cuò)誤配置格式:
使用yml
格式的文件去連接MySQL數(shù)據(jù)庫的代碼如下:
spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8
username: root
password: 123456
3、yml 使用進(jìn)階
當(dāng)然
yml
可不僅僅只有以下這些功能,我們?cè)賮磉M(jìn)階地學(xué)習(xí)一下
3.1 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: ~
3.2 yml 配置讀取
yml 讀取配置的?式和 properties 相同,使? @Value 注解即可分級(jí)目錄下的內(nèi)容讀取不用
:
也是用.
① 普通讀取
- 首先的話我們來看看普通地去進(jìn)行讀取是怎么樣的
@Value("${string.hello}")
private String hello;
② 特殊讀取:value 值加單雙引號(hào)
- 字符串默認(rèn)不?加上單引號(hào)或者雙引號(hào)
- 單引號(hào)會(huì)轉(zhuǎn)義特殊字符,特殊字符最終只是?個(gè)普通的字符串?dāng)?shù)據(jù)
- 雙引號(hào)不會(huì)轉(zhuǎn)義字符串??的特殊字符;特殊字符會(huì)作為本身想表示的意思
以下是測試代碼:
mystr1: 你\n好 # 所見即所得
mystr2: '你\n好' # 所見即所得
mystr3: "你\n好" # 一一輸出字符串內(nèi)部的東西
@Value("${mystr1}")
private String mystr1;
@Value("${mystr2}")
private String mystr2;
@Value("${mystr3}")
private String mystr3;
@PostConstruct // 在spring容器啟動(dòng)的時(shí)候執(zhí)行, 可以做一些初始化的工作
public void doPostConstruct(){
System.out.println("---------------------------------");
System.out.println(mystr1);
System.out.println(mystr2);
System.out.println(mystr3);
System.out.println(hello);
System.out.println("---------------------------------");
}
- 可以看到,在打印輸出后我們可以看到面對(duì)默認(rèn)字符串(中文不會(huì)有問題哦~)和 單引號(hào)字符串 就是打印原先的內(nèi)容
- 但是對(duì)于 雙引號(hào)字符串 便不會(huì)轉(zhuǎn)義字符串??的特殊字符,而是連
\n
也照樣地打印出來,所以就出現(xiàn)了換行的現(xiàn)象
③ 讀取配置對(duì)象
對(duì)于【配置對(duì)象】來說,我們不可以用
@Value
來讀取配置中的對(duì)象,要使用另一個(gè)注解@ConfigurationProperties
-
當(dāng)對(duì)象隨著SpringBoot的啟動(dòng)而啟動(dòng)時(shí),發(fā)現(xiàn)有
@ConfigurationProperties
這個(gè)注解,那Spring就會(huì)知道有人讓我去讀取這個(gè)類,
我們現(xiàn)在配置文件中寫入這個(gè)對(duì)象
# 配置對(duì)象的寫入
student:
id: 1
name: zhangsan
age: 18
然后我們?nèi)?chuàng)建一個(gè)實(shí)體類進(jìn)行測試,記得加上@Component
和@Data
注解哦~
@ConfigurationProperties("student")
@Component // 存對(duì)象:將當(dāng)前的類托管給Spring, 此時(shí)就可以觸發(fā)注解
@Data // 獲取到Get和Set方法
public class StudentComponent {
private int id;
private String name;
private int age;
}
最后在TestController
類中將 StudentComponent類 的對(duì)象通過@Autowired
依賴注入交給Spring去管理
@Autowired // 取對(duì)象:從Spring中去讀取到對(duì)象
private StudentComponent studentComponent;
@PostConstruct
public void doPostConstruct(){
System.out.println("---------------------------------");
System.out.println(studentComponent);
}
④ 讀取配置集合
# 配置集合的寫入
dbtypes:
name:
- mysql
- sqlserver
- db2
或者是使??內(nèi)寫法(與上?的寫法作??致):
dbtypes: {name: [mysql,sqlserver,db2]}
集合的讀取和對(duì)象?樣,也是使?
@ConfigurationProperties
來讀取的,具體實(shí)現(xiàn)如下:
@ConfigurationProperties("dbtypes")
@Component
@Data
public class ListConfig {
private List<String> name;
}
@Autowired
private ListConfig listConfig;
System.out.println(listConfig.getName());
然后我們便可以看到,我們也順利地讀取到了集合中的所有對(duì)象:
?? 想要查看 Spring Boot 更多系統(tǒng)配置項(xiàng),訪問 官?
經(jīng)典面試題:properties VS yml
接下去我們來看一道有關(guān)Spring Boot配置文件很經(jīng)典的面試題: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ā),可以使??份配置?件作為 Java 和 Go 的共同配置?件
- yml ?持更多的數(shù)據(jù)類型
附錄
除了講解上面的一些基礎(chǔ)知識(shí)外,我們?cè)賮硗卣寡由煲幌?/p>
Spring Boot 讀取配置?件的 N 種?法
更多系統(tǒng)配置項(xiàng)
?? 再來講一種企業(yè)里對(duì)于配置文件的定義是怎樣的
- 創(chuàng)建不同環(huán)境的配置?件:
-
application.yml
—— 主配置文件(存放的是公共的配置項(xiàng)) -
application-dev.yml
—— 開發(fā)環(huán)境 -
application-prod.yml
—— 生產(chǎn)環(huán)境 -
application-test.yml
—— 測試環(huán)境
-
給大家看看企業(yè)中的大項(xiàng)目都是怎樣的,都是有多個(gè)配置文件的
- 在 application.yml 中設(shè)置運(yùn)?環(huán)境
從上面企業(yè)級(jí)別的開發(fā)我們可以看出對(duì)于多個(gè)環(huán)境,它們的文件名大致是不變的,變的只是一些特殊的地方,我們只要注意這些就好了,以下是配置文件的命名規(guī)則:
① 必須有主配置文件,主配置文件名必須是 application.yml(.properties)
② 不同平臺(tái)的配置文件,每個(gè)平臺(tái)擁有一個(gè)配置文件,配置文件的名稱有要求 application-xxx.yml
我們自己去模擬一下試試,這里先給出需求:
- 開發(fā)環(huán)境端口號(hào):
6666
- 測試環(huán)境端口號(hào):
7777
- 生產(chǎn)環(huán)境端口號(hào):
8888
然后我們便根據(jù)這個(gè)規(guī)則去配置一下各個(gè)環(huán)境的啟動(dòng)端口號(hào)吧
# 配置application-dev.yml的啟動(dòng)端口號(hào)
server:
port: 6666
# 配置application-dev.yml的啟動(dòng)端口號(hào)
server:
port: 7777
# 配置application-dev.yml的啟動(dòng)端口號(hào)
server:
port: 8888
最后我們?nèi)ブ鞯呐渲梦募O(shè)置當(dāng)前活躍的環(huán)境
spring:
profiles:
active:
- dev
接下去我們重新啟動(dòng)項(xiàng)目來看看啟動(dòng)端口號(hào)是否發(fā)生了變化
然后我再將活躍的環(huán)境改為prod
生產(chǎn)環(huán)境之后,啟動(dòng)端口號(hào)又發(fā)生了一些變化
spring:
profiles:
active:
- prod
?? 以上就是我們對(duì)于企業(yè)當(dāng)中配置文件的一些設(shè)置,讀者可以自己去試試
四、總結(jié)與提煉
最后來總結(jié)一下本文所學(xué)習(xí)的內(nèi)容??
- 首先我們先學(xué)習(xí)了一下什么是配置文件,以及它的作用與其在Spring Boot中的兩種格式
.properties
和.yml
,總覽地對(duì)比了一下兩種文件格式有何不同 - 接下去我們分開地去介紹了一下這兩種文件:
- 對(duì)于
.properties
文件來說,它雖然書寫格式簡單明確,不容易出錯(cuò),但是呢存在著【亂碼問題】和【冗余的信息】這兩塊缺點(diǎn),所以我們推出了.yml
文件 - 對(duì)于
.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 中
- yml 是?個(gè)可讀性?,寫法簡單、易于理解,它的語法和
- 那么對(duì)于
.yml
文件,我們還學(xué)習(xí)了一些進(jìn)階的內(nèi)容,知道了如何去讀取 普通內(nèi)容、value 值加單雙引號(hào)的內(nèi)容、配置對(duì)象以及配置集合 這些
- 對(duì)于
- 然后我們看了一道經(jīng)典的面試題:properties VS yml ,知道它們之間的區(qū)別在哪里了嗎?
- 在最后我們又介紹到了在企業(yè)當(dāng)中配置文件在不同環(huán)境下如何去進(jìn)行設(shè)置,三種環(huán)境分別是:
application-dev.yml
、application-prod.yml
、application-test.yml
以上就是本文要介紹的所有內(nèi)容,感謝您的閱讀??????文章來源:http://www.zghlxwxcb.cn/news/detail-766125.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-766125.html
到了這里,關(guān)于Spring Boot配置文件:properties 與 yml 的競爭的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!