愛(ài)網(wǎng)站網(wǎng)站查詢鄭州seo課程
一、配置文件作用
整個(gè)項(xiàng)目中所有重要的數(shù)據(jù)都是在配置文件中配置的,比如:
-
數(shù)據(jù)庫(kù)的連接信息(包含用戶名和密碼的設(shè)置);
-
項(xiàng)目的啟動(dòng)端口;
-
第三方系統(tǒng)的調(diào)用秘鑰等信息;
-
用于發(fā)現(xiàn)和定位問(wèn)題的普通日志和異常日志等。
想象一下如果沒(méi)有配置信息,那么 Spring Boot 項(xiàng)目就不能連接和操作數(shù)據(jù)庫(kù),甚至是不能保存可以用于排查問(wèn)題的關(guān)鍵日志,所以配置文件的作用是非常重要的
二、配置文件的分類
-
系統(tǒng)的配置文件,比如連接字符串、比如日志的相關(guān)設(shè)置,是系統(tǒng)定義好的
-
用戶自定義的
三、配置文件的格式與規(guī)則
1、格式
Spring Boot 配置文件主要分為以下兩種格式:
.properties
.yml
這就好像連鎖店里面的統(tǒng)一服裝一樣,有兩種不同的款式,properties 類型的配置文件就屬于老款“服飾”,也是創(chuàng)建 Spring Boot 項(xiàng)目時(shí)默認(rèn)的文件格式(主要是由于倉(cāng)庫(kù)里還有庫(kù)存),而 yml 屬于新版款式,如果用戶了解情況直接指定要新款服飾,那么就直接發(fā)給他
2、規(guī)則
-
理論上講 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 文件的配置信息。
-
雖然理論上來(lái)講 .properties 可以和 .yml 共存,但實(shí)際的業(yè)務(wù)當(dāng)中,我們通常會(huì)采取一種統(tǒng)一的配置文件格式,這樣可以更好的維護(hù)(降低故障率),減少開發(fā)者難度。這就好像連鎖店的服飾一樣,不管是老款的服裝還是新款的服裝,一定要統(tǒng)一了才好看
3、為配置文件安裝提示插件
如果 properies 文件沒(méi)有提升信息,那么就需要安裝spring tools插件了
IDEA 社區(qū)版安裝 Spring Assistant 插件之后,就可以正常創(chuàng)建 Spring Boot 項(xiàng)目了,并且 yml 的配置文件就有提示了。但默認(rèn)情況下是不?持 properties 格式的日志提示的,這個(gè)時(shí)候需要安裝了 SpringTools 插件才會(huì)有相應(yīng)的提示
四、讀取配置文件
1、properties
1.1、properties 配置文件說(shuō)明
properties 配置文件是最早期的配置文件格式,也是創(chuàng)建 Spring Boot 項(xiàng)目默認(rèn)的配置文件
1.1、properties 基本語(yǔ)法
properties 是以鍵值的形式配置的,key 和 value 之間是以 “=” 連接的,key=value
,如 application.properties:
# 系統(tǒng)的配置文件
server.port=9090
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8mb4&useSSL=true
characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123# 自定義配置項(xiàng)
cctalk.token=xxx
想要查看 Spring Boot 更多系統(tǒng)配置項(xiàng),訪問(wèn)官網(wǎng):Common Application Properties
PS:不加空格,可能會(huì)被當(dāng)做 value 的一部分
小技巧:配置文件中使用“#”來(lái)添加注釋信息
1.2、關(guān)于 properies 中文亂碼的問(wèn)題處理
1). 配置當(dāng)前項(xiàng)目中文亂碼的問(wèn)題 Settings
2). 配置新創(chuàng)建項(xiàng)目的中文亂碼問(wèn)題 New Projects Settings
3). 將原來(lái)的 application. properies 刪除掉,重新再創(chuàng)建一個(gè) application. properieso
因?yàn)橹暗呐渲梦募呀?jīng)是不支持中文編碼的文件格式化,設(shè)置編碼再創(chuàng)建 application.properies 之后,所以后設(shè)置的編碼不會(huì)改變?cè)瓉?lái)的舊的 application.properies 文件,所以需要先將之前的配置文件刪除掉重新創(chuàng)建。
經(jīng)過(guò)上面的 3 步之后才能創(chuàng)建一個(gè)不是中文亂碼的 application. properies 文件,并且以后在創(chuàng)建 application. properies 不會(huì)出現(xiàn)中文亂碼
1.3、讀取配置文件
如果在項(xiàng)目中,想要主動(dòng)的讀取配置文件中的內(nèi)容,可以使用 @Value 注解來(lái)實(shí)現(xiàn)。
@Value 注解使用 “${}” 的格式讀取,如下代碼所示
@Controller
public class UserController {@Value("${server.port}") // 讀取配置項(xiàng)private String port;@ResponseBody@RequestMapping("/sayhi")public String sayhi() {return "hello, word —— port: " + port;}
}
訪問(wèn) http://localhost:8080/sayhi,最終執(zhí)行效果:hello, word —— port: 8080
@Component 在 Spring Boot 啟動(dòng)時(shí)候會(huì)注入到框架中,注入到框架中時(shí)會(huì)執(zhí)行 @PostConstruct 初始化方法,這個(gè)時(shí)候就能讀取到配置信息了
1.4、properties 缺點(diǎn)分析
讀取多個(gè)配置文件:
properties 配置是以 key-value 的形式配置的
從上述配置key看出,properties 配置文件中會(huì)有很多的冗余的信息:
spring.datasource.username=root
spring.datasource.password=123
想要解決這個(gè)問(wèn)題,就可以使用 yml 配置文件的格式化了
2、yml
2.1、yml 配置文件說(shuō)明
-
yml 是 YAML 是縮寫,它的全稱 Yet Another Markup Language 翻譯成中文就是 “另一種標(biāo)記語(yǔ)言”
-
yml 是一個(gè)寫法簡(jiǎn)單,可讀性高,易于理解,用來(lái)表達(dá)數(shù)據(jù)序列化的格式。它的語(yǔ)法和其他高級(jí)語(yǔ)言類似,
-
支持更多的數(shù)據(jù)類型,可以簡(jiǎn)單表達(dá)清單(數(shù)組)、散列表,標(biāo)量等數(shù)據(jù)形態(tài)。它使用空白符號(hào)縮進(jìn)和大量依賴外觀的特色,特別適合用來(lái)表達(dá)或編輯數(shù)據(jù)結(jié)構(gòu)、各種配置文件等。
-
yml 最大的優(yōu)勢(shì)是可以跨語(yǔ)言,不止是 Java 中可以使用 golang、python 都可以使用 yaml 作為配置文件
2.2、yml 基本語(yǔ)法
yml 是樹形結(jié)構(gòu)的配置文件,它的基礎(chǔ)語(yǔ)法是“key: value”,注意 key 和 value 之間使用英文冒汗加空格的方式組成的,其中的空格不可省略。
基礎(chǔ)語(yǔ)法如下:
其中第一項(xiàng)的配置為正確的,key 也是高亮顯示的,而第二項(xiàng)沒(méi)有空格是錯(cuò)誤的使用方式,第二項(xiàng)的key 也沒(méi)有高亮顯示

2.3、使用 yml 連接數(shù)據(jù)庫(kù)
application.yml:
# 連接數(shù)據(jù)庫(kù)
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8mb4&useSSL=truename: rootpassword: 123
yml 和 properties 連接數(shù)據(jù)庫(kù)的配置對(duì)比:
3、yml 使用進(jìn)階
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 讀取配置的方式和 properties 相同,使用 @Value 注解即可,實(shí)現(xiàn)代碼如下:
@Component
public class ReadYml {@Value("${string.hello}")private String hello;@PostConstructpublic void postConstruct() {System.out.println("Read YML,Hello:" + hello);}
}
使用代碼測(cè)試一下,讀取值為 null 的配置和根本不存在的配置結(jié)果是否一致?
3.3、value 值加單雙引號(hào)
字符串默認(rèn)不用加上單引號(hào)或者雙引號(hào),如果加英文的單雙引號(hào)可以表示特殊的含義
嘗試在 application.yml 中配置如下信息:
mystring1: hello\nword
mystring2: 'hello\nword'
mystring3: "hello\nword"
讀取程序?qū)崿F(xiàn)代碼如下:
@Controller
public class UserController {@Value("${mystring1}") // 讀取配置項(xiàng)private String mystring1;@Value("${mystring2}")private String mystring2;@Value("${mystring3}")private String mystring3;@ResponseBody@RequestMapping("/sayhi")public String sayhi() {System.out.println("mystring1: " + mystring1);System.out.println("mystring2: " + mystring2);System.out.println("mystring3: " + mystring3);}
}
訪問(wèn) http://localhost:8080/sayhi,執(zhí)行結(jié)果:
如果在 mystring3 中加入轉(zhuǎn)義符 \
:mystring3: "hello\\nword"
結(jié)果:mystring3: hello\nword
從上述結(jié)果可以看出:
- 字符串默認(rèn)不用加上單引號(hào)或者雙引號(hào)
- 單引號(hào)會(huì)轉(zhuǎn)義特殊字符,特殊字符最終只是一個(gè)普通的字符串?dāng)?shù)據(jù)
- 如果不加,或者加了單引號(hào),那么默認(rèn)會(huì)將字符串中的特殊字符進(jìn)行轉(zhuǎn)義,比如\n -> \ ln(轉(zhuǎn)義)處理
- yml 中如果使用了雙引號(hào)就會(huì)按照(原)語(yǔ)義執(zhí)行,雙引號(hào)不會(huì)轉(zhuǎn)義字符串里面的特殊字符;特殊字符會(huì)作為本身想表示的意思
3.4、yml 對(duì)象配置和讀取
——application.yml:
# 對(duì)象寫法 1:
student:id: 1name: 張三age: 20# 對(duì)象寫法 2:行內(nèi)寫法(與上面的寫法作用一致)
student2: {id: 2,name: 李四,age: 20}
這個(gè)時(shí)候就不能用 @Value 來(lái)讀取配置中的對(duì)象了,此時(shí)要使用另一個(gè)注解 @ConfigurationProperties
來(lái)讀取 常見類 Student,具體實(shí)現(xiàn)如下:
@Data
中包含了 getter,setter,toString 等
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@ConfigurationProperties(prefix = "student") // 讀取配置文件中的對(duì)象 在項(xiàng)目啟動(dòng)時(shí)讀取
@Component // 不能省略
public class Student {private int id;private String name;private int age;
}
——調(diào)用類的實(shí)現(xiàn)如下:
@Controller
public class UserController {@Autowiredprivate Student student; // 屬性注入@ResponseBody@RequestMapping("/sayhi")public String sayhi() {return "student: " + student;}
}
訪問(wèn),執(zhí)行效果:student: Student(id=1, name=張三, age=20)
讀李四:修改Student 類:@ConfigurationProperties(prefix = “student2”)。
3.5、yml 配置集合
——application.yml:
# 集合寫法 1:
dbtypes:
name:- mysql- sqlserver- db2# 集合寫法 2:行內(nèi)寫法(與上面的寫法作用一致)
dbtype: {name: [mysql,sqlserver,db2]}
——集合的讀取和對(duì)象一樣,也是使用 @ConfigurationProperties 來(lái)讀取的,創(chuàng)建類 ReadList 具體實(shí)現(xiàn)如下:
@Component
@Data
@ConfigurationProperties("dbtype") // 讀取配置文件中的集合
public class ReadList {private List<String> name;
}
——打印類的實(shí)現(xiàn)如下:
@Controller
public class UserController {@Resourceprivate ReadList readList;@ResponseBody@RequestMapping("/sayhi")public String sayhi() {return "readList: " + readList.getName();}
}
訪問(wèn),執(zhí)行效果:readList: [mysql, sqlserver, db2]
4、properties VS yml 總結(jié)
properties 是以 key=value 的形式配置的鍵值類型的配置文件,而 yml 使用的是類似 json 格式的樹形配置方式進(jìn)行配置的,yml 層級(jí)之間使用換行縮進(jìn)的方式配置,key 和 value 之間使用“: ”英文冒號(hào)加空格的方式設(shè)置,并且空格不可省略。
properties 為早期并且默認(rèn)的配置文件格式,但其配置存在一定的冗余數(shù)據(jù),使用 yml 可以很好的解決數(shù)據(jù)冗余的問(wèn)題。
yml 通用性更好,?持更多語(yǔ)言,如 Java、Go、Python 等,如果是云服務(wù)器開發(fā),可以使用一份配置文件作為 Java 和 Go 的共同配置文件。
yml 雖然可以和 properties 共存,但一個(gè)項(xiàng)目中建議使用統(tǒng)一的配置類型文件
五、SpringBoot有幾種讀取配置文件的方法?
Spring Boot 中讀取配置文件有以下 5 種方法:
-
使用@Value 讀取配置文件
-
使用@ConfigurationProperties讀取配置文件
-
使用Environment讀取配置文件
-
使用@PropertySource 讀取配置文件
使用@PropertySource 注解可以用來(lái)指定讀取某個(gè)配置文件,比如指定讀取application.properties配置文件的配置內(nèi)容
@PropertySource 注解默認(rèn)只支持 properties 格式配置文件的讀取
@springBootApplication
@PropertySource( "classpath:application.properties", encoding="utf-8")
public class DemoApplication implements InitializingBean {@Value("${profile.name}")private string name;public static void main(String[ ] args) {SpringApplication.run(DemoApplication.class, args );}@Overridepublic void afterPropertiesSet( ) throws Exception {System.out.println("Name: " +name ) ;}
- 使用原生方式讀取配置文件