什么是配置文件
配置文件是一種文本文件,通常用于存儲(chǔ)程序的參數(shù)和設(shè)置。它包含了程序運(yùn)行所需的各種選項(xiàng)和配置信息,例如界面風(fēng)格、服務(wù)器連接信息、默認(rèn)語(yǔ)言等。這些信息可以通過(guò)鍵值對(duì)的形式表示,也可以使用特定的語(yǔ)法和結(jié)構(gòu)描述更復(fù)雜的配置信息。
配置文件通常由程序在啟動(dòng)時(shí)讀取和解析,以自定義程序的行為。例如,在網(wǎng)站開(kāi)發(fā)中,網(wǎng)站的配置文件通常包含了數(shù)據(jù)庫(kù)連接信息、安全性設(shè)置、日志記錄等重要信息。在操作系統(tǒng)中,配置文件則可以用于指定各種系統(tǒng)參數(shù),如網(wǎng)絡(luò)連接、設(shè)備驅(qū)動(dòng)程序等。
配置文件的格式和內(nèi)容因程序而異,常見(jiàn)的配置文件格式包括INI文件、XML文件、JSON文件等。INI文件是最早的配置文件格式之一,它使用簡(jiǎn)單的鍵值對(duì)語(yǔ)法來(lái)存儲(chǔ)配置信息。XML和JSON文件則更加靈活和可擴(kuò)展,可以描述更復(fù)雜的配置信息。
除了使用傳統(tǒng)的文本編輯器手動(dòng)編寫(xiě)配置文件外,現(xiàn)在也有許多工具可以幫助用戶(hù)輕松地編輯和管理配置文件。例如,一些應(yīng)用程序具有自己的配置文件編輯器,用戶(hù)可以通過(guò)界面來(lái)直觀(guān)地編輯配置信息。另外,一些配置管理工具則可以幫助用戶(hù)自動(dòng)化地管理和維護(hù)配置文件,例如版本控制、備份和恢復(fù)等。
SpringBoot配置文件
SpringBoot?持并定義了配置?件的格式,也在另?個(gè)層?達(dá)到了規(guī)范其他框架集成到SpringBoot的?的。
很多項(xiàng)?或者框架的配置信息也放在配置?件中,?如:
- 項(xiàng)目的啟動(dòng)端口
- 數(shù)據(jù)庫(kù)的連接信息(包含用戶(hù)名和密碼的設(shè)置)
- 第三?系統(tǒng)的調(diào)?密鑰等信息
- ?于發(fā)現(xiàn)和定位問(wèn)題的普通?志和異常?志等
每個(gè) Spring 項(xiàng)目都內(nèi)置了一個(gè) Tomcat 服務(wù)器,而 Tomcat 默認(rèn)使用的端口是 8080,如果 8080 端口被占用或者多個(gè) Spring 項(xiàng)目同時(shí)啟動(dòng)的話(huà),就會(huì)出現(xiàn)某些程序無(wú)法正常啟動(dòng)的情況,所以這時(shí)候就可以使用 Spring 的配置文件修改啟動(dòng)的端口。
不僅如此,在日常生活中我們很多時(shí)候都會(huì)和數(shù)據(jù)庫(kù)打交道,而每個(gè)人甚至一個(gè)人的不同機(jī)器上的數(shù)據(jù)庫(kù)用戶(hù)名、密碼和 IP 地址都是有區(qū)別的,那么當(dāng)這個(gè)項(xiàng)目交給別人的時(shí)候就需要在 Spring 配置文件中修改相關(guān)的配置。
不僅如此,一些公共的屬性以及會(huì)根據(jù)情況而改變的屬性都可以放在這個(gè) Spring 配置文件中,通過(guò)使用 Spring 配置文件可以幫助我們解決很多的問(wèn)題。
配置文件快速入手
我們先通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)了解配置文件的作用。
我們創(chuàng)建 SpringBoot 項(xiàng)目的時(shí)候,會(huì)自動(dòng)生成一個(gè) application.properties
文件,這就是默認(rèn)的 SpringBoot 配置文件,我們?cè)谶@個(gè)配置文件中修改啟動(dòng)端口號(hào)看看結(jié)果。
server.port=9090
這里可以看到啟動(dòng)端口號(hào)修改成功了。
如果我們想要訪(fǎng)問(wèn)這個(gè)項(xiàng)目就不能使用 127.0.0.1:8080
了,而要使用 127.0.0.1:9090
地址了。
配置文件的格式
SpringBoot 的配置文件有三種形式:
- application.properties
- application.yml
- application.yaml
yml 是 yaml 的縮寫(xiě),兩個(gè)使用方式是相同的。并且這兩個(gè)配置文件還是生活中使用頻率最高的。
當(dāng)應(yīng)?程序啟動(dòng)時(shí),SpringBoot會(huì)?動(dòng)從classpath路徑找到并加載
application.properties 和 application.yaml 或者 application.yml ?件,當(dāng)然也可以使用 spring.config.name
指定文件路徑和名稱(chēng)。
那么 properties 配置文件和 yml 配置文件有什么區(qū)別呢?區(qū)別主要體現(xiàn)在語(yǔ)法和使用場(chǎng)景上。properties 配置格式出現(xiàn)的比較早,而 yml 配置格式出現(xiàn)的則比較晚,并且在語(yǔ)法上,yml 配置格式相較于 properties 配置格式來(lái)說(shuō)更加的簡(jiǎn)介,并且很重要的是:properties 配置文件中如果出現(xiàn)中文的話(huà)出現(xiàn)亂碼的幾率非常大,而 yml 配置格式則對(duì)中文的支持度是比較高的。存在兩種配置格式,可以一定程度上降低程序員的學(xué)習(xí)成本。
- 理論上講 .properties 和 .yml 可以并存在于?個(gè)項(xiàng)?中,當(dāng) .properties 和 .yml 并存時(shí),兩個(gè)配置都會(huì)加載。如果配置?件內(nèi)容有沖突,則以 .properties 為主,也就是 .properties 優(yōu)先級(jí)更高
- 雖然理論上來(lái)講 .properties 可以和 .yml 共存,但實(shí)際的業(yè)務(wù)當(dāng)中,我們通常會(huì)采取?種統(tǒng)?的配置?件格式,這樣可以更好的維護(hù)(降低故障率)
properties 配置文件說(shuō)明
properties 配置?件是最早期的配置?件格式,也是創(chuàng)建 SpringBoot 項(xiàng)?默認(rèn)的配置?件。
properties 基本語(yǔ)法
properties 配置格式是以鍵值對(duì)的形式存在的,key 和 value 之間通過(guò)“=”連接。并且 key 和 value 之間可以存在多個(gè)空格。
# 配置啟動(dòng)端口號(hào)
server.port=9090
# 配置數(shù)據(jù)庫(kù)連接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?charEncoding=utf8&userSSL=false
spring.datasource.name=root
spring.datasource.password=123456
配置文件中使用 #
添加注釋信息。
讀取配置文件信息
在項(xiàng)目中,如果想要主動(dòng)讀取配置文件中的信息的話(huà),可以使用 @Value
注解來(lái)實(shí)現(xiàn)。
mykey=zhangsan
package com.example.springconfiguration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PropertiesController {
@Value("mykey")
private String key;
@RequestMapping("/getkey")
public String getKey() {
return "獲取到key:" + key;
}
}
這是為什么呢?我們的 mykey 不是 zhangsan 嗎?為什么獲取到的是 mykey 呢?
這是因?yàn)?Spring 將@Value
中的 “mykey” 當(dāng)作了 value 賦值給了 key,那么我們?cè)撊绾尾拍塬@取到 key mykey 中的 value 值呢?
要想獲取到 @Value
key 中的 value 值,需要使用 ${}
來(lái)獲取到這里面的 key 的 value 值。
@Value("${mykey}")
properties 配置格式缺點(diǎn)
為什么說(shuō) properties 配置格式對(duì)中文不是很友好呢?我們來(lái)看看:
mykey=張三
為什么就肯定說(shuō)是 properties 配置文件的問(wèn)題而不是我們前端接收到響應(yīng)之后出現(xiàn)的問(wèn)題呢?我們打斷點(diǎn)看看。
這里我們讀取到 mykey 的時(shí)候就是亂碼,而是我的 idea 也是默認(rèn)是 UTF-8 格式,是支持中文的,所以說(shuō) properties 配置文件中盡量不要出現(xiàn)中文。
不僅如此,通過(guò)觀(guān)察 properties 配置文件中的信息,我們會(huì)發(fā)現(xiàn)里面的內(nèi)容是比較冗余的。
以上只是 properties 的兩個(gè)顯著的缺點(diǎn)。
yml 配置文件說(shuō)明
yml 是 YAML 的縮寫(xiě),它的全稱(chēng) Yet Another Markup Language 翻譯成中?就是“另?種標(biāo)記語(yǔ)?。光看 yml 的翻譯就可以看出來(lái) yml 的理想是非常遠(yuǎn)的“語(yǔ)言”。我們先來(lái)看看 yml 配置文件的基本語(yǔ)法。
yml 基本語(yǔ)法
yml 配置文件對(duì)于語(yǔ)法要求是非常嚴(yán)格的,他雖然也是以鍵值對(duì)的形式存在的,但是 key 和 value 之間必須以 冒號(hào) + 空格 相連接,這個(gè)空格是不能省略的。
如果配置成功,那么屬性就會(huì)有高亮提示。
這種灰色,就說(shuō)明該屬性沒(méi)有配置成功,也就是語(yǔ)法存在問(wèn)題。
空格可以有多個(gè)。
使用 yml 連接數(shù)據(jù)庫(kù)
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&userSSL=false
username: root
password: 123456
這種 yml 配置方式顯示出了層級(jí)關(guān)系并且節(jié)省了很多代碼:url、username和password屬性屬于datasource,而 datasource 則屬于 spring。
yml 使用進(jìn)階
yml 的使用不止有這些,還有其他更厲害的用法。
yml 配置不同數(shù)據(jù)類(lèi)型
前面 properties 配置格式差不多所有的配置都是字符串類(lèi)型,而在 yml 配置格式中還存在布爾類(lèi)型、整數(shù)類(lèi)型、浮點(diǎn)數(shù)類(lèi)型以及Null類(lèi)型。
# 字符串
string.value: hello
# 布爾類(lèi)型
boolean.value: true
boolean.value1: false
# 整數(shù)類(lèi)型
int.value: 10
# 浮點(diǎn)數(shù)
float.value: 3.14159
# Null ~ 代表null
null.value: ~
那么 yml 配置文件的屬性如何讀取呢?這些基本的數(shù)據(jù)類(lèi)型是和 properties 配置格式是一樣的,都是使用 @Value
注解來(lái)獲取到指定的配置。
package com.example.springconfiguration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PropertiesController {
@Value("${string.value}")
private String stringValue;
@Value("${boolean.value}")
private boolean flg1;
@Value("${boolean.value1}")
private boolean flg2;
@Value("${int.value}")
private int intValue;
@Value("${float.value}")
private float floatValue;
@Value("${null.value}")
private String nullValue;
@RequestMapping("/getkey")
public String getKey() {
return stringValue + " | " + flg1 + " | " + flg2 + " | "
+ intValue + " | " + floatValue + " | " + nullValue;
}
}
值得注意的是,在 yml 配置格式中,字符串的表現(xiàn)形式有三種,一種是不加引號(hào)、一種是加單引號(hào)、還有一種就是加雙引號(hào),與 properties 配置格式不同,因?yàn)?properties 配置格式都是字符串類(lèi)型,所以從等號(hào)后面的第一個(gè)非空格字符開(kāi)始就會(huì)被當(dāng)成是字符串。
properties 配置格式
mykey1=abcde
mykey2='abcde'
mykey3="abcde"
@RestController
public class PropertiesController {
@Value("${mykey1}")
private String mykey1;
@Value("${mykey2}")
private String mykey2;
@Value("${mykey3}")
private String mykey3;
@RequestMapping("/getkey")
public String getKey() {
return mykey1 + " | " + mykey2 + " | " + mykey3;
}
}
yml 配置格式
string1: abcde
string2: 'abcde'
string3: "abced"
@RestController
public class YmlController {
@Value("${string1}")
private String string1;
@Value("${string2}")
private String string2;
@Value("${string3}")
private String string3;
@RequestMapping("/getymlkey")
public String getKey() {
return string1 + " | " + string2 + " | " + string3;
}
}
根據(jù)輸出的內(nèi)容可以看到,yml 中表示字符串的方式有三種,但是這三種方式又有一些區(qū)別。
string1: abc \n de
string2: 'abc \n de'
string3: "abc \n ed"
@RestController
public class YmlController {
@Value("${string1}")
private String string1;
@Value("${string2}")
private String string2;
@Value("${string3}")
private String string3;
@RequestMapping("/getymlkey")
public String getKey() {
System.out.println(string1);
System.out.println(string2);
System.out.println(string3);
return string1 + " | " + string2 + " | " + string3;
}
}
可以看到?jīng)]有引號(hào)和單引號(hào)的用法基本上是一樣的,但是雙引號(hào)就會(huì)有區(qū)別,沒(méi)有引號(hào)和單引號(hào)會(huì)將字符串中的一些特殊符號(hào)進(jìn)行轉(zhuǎn)義,使之呈現(xiàn)出跟字符串里面一樣的內(nèi)容,而雙引號(hào)則不會(huì)進(jìn)行轉(zhuǎn)義。
配置對(duì)象
yml 中不僅能配置一些基本的數(shù)據(jù)類(lèi)型,還可以配置對(duì)象。???我沒(méi)聽(tīng)錯(cuò)吧?yml 配置格式還能配置對(duì)象?沒(méi)錯(cuò),你沒(méi)聽(tīng)錯(cuò),我們 yml 就是這么厲害。那么在 yml 中如何配置對(duì)象呢?
student:
id: 123
name: zhangsan
age: 18
類(lèi)似上面的配置格式就是 yml 配置對(duì)象,當(dāng)然也可以使用行內(nèi)寫(xiě)法(跟上面的寫(xiě)法作用是一致的)。
student1: {id: 234, name: lisi, age: 20}
那么如何取出配置的對(duì)象呢?這時(shí)候就不能使用 @Value
注解了,需要使用 ConfigurationProperties
注解,并且取出也需要借助類(lèi)來(lái)讀取。
package com.example.springconfiguration;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "student")
public class Student {
private int id;
private String name;
private int age;
}
僅僅只是通過(guò)類(lèi)來(lái)讀取也是不行的,還需要保證類(lèi)中的屬性名稱(chēng)和 yml 配置文件中的對(duì)象的屬性名稱(chēng)一致,并且類(lèi)中為這些屬性提供了 getter 和 setter 方法。
這是 ConfigurationProperties
注解的參數(shù),如果不指定參數(shù)的名稱(chēng)的話(huà),默認(rèn)就是value/prefix。
package com.example.springconfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
public class StudentController {
@Autowired
private Student student;
@RequestMapping("/readStudent")
public String readStudent() {
return student.toString();
}
}
配置集合
yml 配置文件還可以配置集合。
dbtypes:
name:
- mysql
- sqlserver
- db2
讀取 yml 配置文件中的集合同樣是依賴(lài) ConfigurationProperties
注解和類(lèi)以及類(lèi)中的 getter 和 setter 方法。
package com.example.springconfiguration;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ConfigurationProperties(prefix = "dbtypes")
@Data
public class ListConfig {
private List<String> name;
}
package com.example.springconfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ListController {
@Autowired
private ListConfig listConfig;
@RequestMapping("/readList")
public String readList() {
return listConfig.toString();
}
}
配置Map
yml 配置格式還可以配置 Map 類(lèi)型的屬性。
maptypes:
map:
k1: China
k2: America
k3: Japanese
行內(nèi)寫(xiě)法:
maptypes2: {map: {k1: China, k2: America, k3: Japanese}}
讀取 Map 類(lèi)型配置也是依賴(lài) ConfigurationProperties
注解和類(lèi)以及類(lèi)中的 getter 和 setter 方法。
package com.example.springconfiguration;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "maptypes")
@Data
public class MapConfig {
private Map<String, String> map;
}
package com.example.springconfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MapController {
@Autowired
private MapConfig mapConfig;
@RequestMapping("/readMap")
public String readMap() {
return mapConfig.toString();
}
}
設(shè)置不同環(huán)境的配置文件
有可能我們一個(gè)項(xiàng)目中針對(duì)不同的情況會(huì)有不同的配置,那么我們是否要每到一個(gè)新環(huán)境就將另一個(gè)配置文件中的內(nèi)容復(fù)制到當(dāng)前使用的配置文件中嗎?其實(shí)沒(méi)必要,一個(gè) Spring 項(xiàng)目中允許存在多個(gè)配置文件,并且我們可以指定使用哪個(gè)配置文件。
但是需要注意的是,spring 中的配置文件必須以 application-xxx.yml
格式命名。比如 application-dev.yml
和 application-prod.yml
,如果需要切換的話(huà),只需要在 application.yml
配置文件中加入
spring:
profiles:
active: dev # application-xxx.yml 這里填 - 后面的字符
假設(shè)我們這里使用 application-dev.yml
配置文件。
YML優(yōu)缺點(diǎn)
優(yōu)點(diǎn):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-761538.html
- 易讀性強(qiáng):YAML采用縮進(jìn)和符號(hào)的方式表示層次結(jié)構(gòu),使得配置文件易于閱讀和理解。
- 數(shù)據(jù)結(jié)構(gòu)豐富:YAML支持多種數(shù)據(jù)結(jié)構(gòu)類(lèi)型,如標(biāo)量、數(shù)組、映射等,可以方便地表示各種數(shù)據(jù)結(jié)構(gòu)。
- 支持多語(yǔ)言:YAML的語(yǔ)法簡(jiǎn)潔,易于學(xué)習(xí),支持多種編程語(yǔ)言進(jìn)行解析和讀取。
缺點(diǎn):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-761538.html
- 錯(cuò)誤易引入:由于YAML的縮進(jìn)規(guī)則嚴(yán)格,如果縮進(jìn)不一致或者符號(hào)使用不當(dāng),會(huì)導(dǎo)致解析錯(cuò)誤。
- 安全性問(wèn)題:由于YAML易于閱讀和編寫(xiě),可能存在被篡改的風(fēng)險(xiǎn)。在安全敏感的應(yīng)用中,需要采取額外的安全措施。
- 依賴(lài)外部庫(kù):在某些編程語(yǔ)言中,需要依賴(lài)特定的第三方庫(kù)才能解析和讀取YAML文件。這可能會(huì)增加開(kāi)發(fā)者的負(fù)擔(dān)。
到了這里,關(guān)于【Spring】SpringBoot 配置文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!