文章目錄
- 1. 配置文件的作用
- 2. 配置文件格式
- 3. 配置文件的使用方法
- 3.1. properties配置文件
- 3.1.1. 基本語法和使用
- 3.1.2. properties優缺點分析
- 3.2. yml配置文件
- 3.2.1. 基本語法與使用
- 3.2.2. yml中單雙引號問題
- 3.2.3. yml配置不同類型的數據類型及null
- 3.2.4. 配置對象
- 3.2.5. 配置集合
- 3.2.6. yml優點分析
- 4. properties與yml的區別
- 5. 設置不同環境的配置文件
1. 配置文件的作用
SpringBoot 項目中所有重要的數據都是在配置文件中配置的,比如∶
- 數據庫的連接信息(包含用戶名和密碼的設置);
- 項目的啟動端口;
- 第三方系統的調用秘鑰等信息;
- 用于發現和定位問題的普通日志和異常日志;
- 還可以自定義配置,如配置上傳文件的保存地址信息等。
想象一下如果沒有配置信息,那么 Spring Boot 項目就不能連接和操作數據庫,甚至是不能保存可以用于排查問題的關鍵日志,所以配置文件的作用是非常重要的。
配置文件中的配置類型有兩類,一類是系統配置項,這種配置的格式都是固定的,是給系統(框架)使用的;另一種是用戶自定義配置,用戶可以隨意地規定配置項的格式,又用戶自行去設置和讀取。
2. 配置文件格式
SpringBoot 項目配置文件有兩種,一種是項目創建默認自帶的的properties
文件,還有一種比較新的yml
文件(需要自己添加)。
配置文件是存在于resources
目錄下的,對于 SpringBoot 項目默認的配置文件,配置文件名必須是application
,即application.properties
或application.yml
文件,如果配置文件名不為application
那就不能夠被識別加載。
properties
是可以和yml
?起存在于?個項?當中的,yml
文件相比于properties
文件做了一些優化,如yml
文件天然支持中文字符,而properties
文件默認是不支持中文字符的,如果不進行字符配置,輸入中文字符就會有亂碼現象。
當application.properties
和application.yml
兩個文件共存時, 雖然兩個文件中的配置都會被加載,但如果這兩個配置?件中出現了同樣的配置(比如 properties 和 yml 中都配置了“server.port” ), 那么這個時候會以properties
中的配置為主,也就是.properties
配置?件的優先級最?。
雖然理論上來講 .properties 可以和 .yml 共存,但實際的業務當中,我們通常會采取?種統?的配置?件格式,這樣可以更好的維護(降低故障率)。
3. 配置文件的使用方法
properties 配置文件是最早期的配置文件格式,也是創建 Spring Boot 項目默認的配置文件。
3.1. properties配置文件
3.1.1. 基本語法和使用
🎯基本語法:
properties 是以鍵值的形式配置的,key 和 value 之間是以“=”連接的, 使?“#”來添加注釋信息。
# key與=與value之間不要加空格
key=value
比如,設置端口號,我們可以使用配置項server.port
來設置端口:
server.port=8088
配置修改完畢后,啟動程序,就可以看到端口號已經設置成配置文件中所設置的端口號了。
還有比如設置數據庫,配置項如下:
# 配置數據庫 URL
spring.datasource.url="jdbc:mysql://127.0.0.1:3306/tr?characterEncoding=utf8&useSSL=false"
# 配置數據庫 username
spring.datasource.name="root"
# 配置數據庫 password
spring.datasource.password="111111"
# 設置驅動
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
有關更多系統的配置,可以去看看官方文檔:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties
除了設置配置文件的信息除了系統的配置,我們還可以自定義配置,比如:
# 用戶自定義配置
custom.name=zhangsan
custom.id=666
🎯此時要讀取配置文件中的信息,我們可以使用@Value
注解來實現,規則如下:
// 要注意${}不能省略
@Value("${配置信息key}")
private String name;
示例代碼:
package com.example.springboot.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@ResponseBody
public class TestController2 {// 自定義配置和系統配置都可以讀取@Value("${custom.name}")private String name;@Value("${custom.id}")private String id;@Value("${server.port}")private String port;@RequestMapping("/coustom")public String sayHi() {return "name : " + name + " "+ "id : " + id + " "+ "port : " + port;}
}
瀏覽器訪問結果:
3.1.2. properties優缺點分析
優點:
- 配置文件結構清晰:key=value,不容易出錯,適合初學者。
缺點:
- 寫法上比較冗余,臃腫,yml 配置文件能夠解決這個問題。
3.2. yml配置文件
yml 是 YMAL(Yet Another Markup language)的縮寫,翻譯為另一種標記語言。
3.2.1. 基本語法與使用
🎯基本語法:
yml 是樹型結構配置文件,特別需要注意的是 key 和 value 之間需要使用英文冒號加空格,空格一定是不能省略的。
# :后面空格一定不能省
key: value
此時,將上面的propertise
轉換成yml
格式看一下。
# 配置端口
server:port: 8088
# 配置數據庫
spring:datasource:url: "jdbc:mysql://127.0.0.1:3306/tr?characterEncoding=utf8&useSSL=false"username: "root"password: "111111"
# 自定義配置信息
custom:name: zhangsanid: 666
這里讀取 yml 配置文件的方式和 properties 配置文件是一樣的,就不再演示了。
3.2.2. yml中單雙引號問題
我們嘗試將配置文件中的配置信息設置成如下字樣:
string:str1: Hello \n Spring Boot.str2: 'Hello \n Spring Boot.'str3: "Hello \n Spring Boot."
我們將這些配置信息注入到一個類,我們嘗試來讀取它們,這個代碼 @Controller 在 Spring Boot 啟動時候會把 YmlString 對象注?到框架中,當注?到框架中時會執? @PostConstruct 初始化方法,就是此時讀到的配置信息。
@Controller
public class YmlString {@Value("${string.str1}")private String str1;@Value("${string.str2}")private String str2;@Value("${string.str3}")private String str3;@PostConstructpublic void postConstruct() {System.out.println("string.str1:" + str1);System.out.println("string.str2:" + str2);System.out.println("string.str3:" + str3);}
}
控制臺輸出結果:
這就說明,被雙引號包裹的值,是按照原語義執行的,而被單引號包裹值(特殊字符)會發生轉義,像上面的例子就是\n
轉義成了\\n
,所以就輸出了\n
,最終就只是一個普通的字符串。
至于不加雙引號的輸出結果是因為 yml 中字符串默認是不加引號的,就直接輸出了。
3.2.3. yml配置不同類型的數據類型及null
格式如下:
# 字符串
string.value: Hello
# 布爾值,true或false
boolean.value: true
boolean.value1: false
# 整數
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # ?進制
# 浮點數
float.value: 3.14159
float.value1: 314159e-5 # 科學計數法
# Null,~代表null
null.value: ~
使用:
package com.example.springboot.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class TestController3 {@Value("${string.value}")private String str;@Value("${boolean.value}")private boolean bool;@Value("${float.value}")private float flo;@Value("${null.value}")private Integer nul;@PostConstructpublic void postConsrtuct() {System.out.println("str: " + str);System.out.println("bool: " + bool);System.out.println("flo: " + flo);System.out.println("nul: " + nul);}
}
運行結果:
3.2.4. 配置對象
對于 ym l配置文件,還能進行對象的配置,如設置一個Student
對象:
方式1:
student:id: 1name: 張三age: 18
方式2:
student: {id: 1,name: 張三,age: 18}
此時從配置文件讀取自定義的對象,就不可以使用 @Value 注解來讀取了,需要使用@ConfigurationProperties
注解來進行對象的讀取,并且對應的類必須有getter和setter
方法。
🍂示例:
學生類:
我們這里就不自己寫getter和setter
方法了,我們使用 Lombok 框架中的 @Data 注解即可,其中就包含了get,set 和 toString,免去了手動創建的步驟了。
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@ConfigurationProperties(prefix = "student")
@Component
public class Student {private int id;private String name;private int age;
}
使用類:
package com.example.springboot.controller;import com.example.springboot.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import javax.annotation.PostConstruct;@Controller
public class ConfigController {@Autowiredprivate Student student;@PostConstructpublic void postConsrtuct() {System.out.println(student);}
}
運行結果:
3.2.5. 配置集合
yml 還能配置集合
🎯比如配置 list 集合,配置方式如下:
方式1:
dbtypes:name:- mysql- sqlserver- db2
方式2(推薦):
dbtypes: {name: [mysql, sqlserver, db2]}
獲取與對象的獲取方式一模一樣,只是現在需要類里面的一個屬性為集合對象。
獲取示例:
與配置文件對應的對象。
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.List;@Data
@ConfigurationProperties(prefix = "dbtypes")
@Component
public class ConfigList {private List<String> name;
}
使用類:
package com.example.springboot.controller;import com.example.springboot.model.ConfigList;
import org.springframework.stereotype.Controller;import javax.annotation.PostConstruct;
import javax.annotation.Resource;@Controller
public class ConfigController {@Resourceprivate ConfigList configList;@PostConstructpublic void postConstruct() {System.out.println(configList.getName());}
}
運行結果:
🎯再比如配置 map 集合,配置方式如下:
方式1:
tes:map:1: 張三2: 李四
方式2:
tes:maps: {1: 張三,2: 李四}
獲取示例:
與配置文件對應的對象:
package com.example.springboot.model;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;@Data
@ConfigurationProperties(prefix = "tes")
@Component
public class ConfigMap {private Map<Integer, String> map;
}
使用類:
package com.example.springboot.controller;import com.example.springboot.model.ConfigMap;
import org.springframework.stereotype.Controller;import javax.annotation.PostConstruct;
import javax.annotation.Resource;@Controller
public class ConfigController2 {@Resourceprivate ConfigMap configMap;@PostConstructpublic void postConstruct() {System.out.println(configMap.toString());}
}
運行結果:
3.2.6. yml優點分析
- yml 是?個可讀性?,寫法簡單、易于理解,它的語法和 JSON 語?類似。
- yml ?持更多的數據類型,它可以簡單表達清單(數組)、散列表,標量等數據形態。
- 它使?空? 符號縮進和?量依賴外觀的特?,特別適合?來表達或編輯數據結構、各種配置?件等。
- yml ?持更多的編程語?,它不?是 Java 中可以使?在 Golang、PHP、Python、Ruby、 JavaScript、Perl 中。
4. properties與yml的區別
- 語法不同:properties 是 以key = value 的形式配置的鍵值類型的配置文件,而 yml 使用的是類似于 json 格式的樹型配置方式進行配置的,yml 層級之間使用的是換行縮進的方式配置的,key 和 value 之間使用英文冒號
:
加空格的方式設置的,且空格不可省略。 - properties 為早期并且默認的配置文件格式,但配置存在一定的冗余數據,使用 yml 可以很好的解決數據冗余問題。
- yml 通用性更好,支持更多語言,如 Java、Go、Python,如果是云服務器開發,可以使用一份 yml 配置文件作為 Java 和 Go 的共同配置文件。
- yml 和 properties 可以共存,但一個項目中建議使用統一的配置類型文件。
- yml 相較于 properties 支持更多的數據類型,如對象和集合。
5. 設置不同環境的配置文件
在日常開發中,通常會使用至少三個不同的環境:開發環境(dev)、測試環境(test)和生產環境(prod);每個環境的配置都不相同,包括數據庫、端口、IP 地址等信息;那么如何區分這些環境,如何打包呢?
Spring Boot 中提供了很好的多環境整合支持,可以在打包和運行時自由切換不同的環境。
為了方便管理不同環境的配置,可以將它們放在不同的配置文件中,此時我們就需要創建不同環境的配置文件了,例如application-dev.properties
、application-test.properties
和application-prod.properties
。
需要注意的是,配置文件的命名必須遵循application-name.properties
或application-name.yml
的格式,其中的name
可以自定義,用于區分不同的環境。
因此,在整個項目中,需要有四個配置文件,包括application.properties
(主配置文件,是必須存在的)和三個不同環境的配置文件。
此時創建了各個環境的配置文件條件下,還需要告訴 SpringBoot 你要運行哪個環境,主要有兩種指定方式。
🎯方式1:在主配置文件中指定
可以在主配置文件(application.properties
或者application.yml
)中指定,內容如下:
# 指定運行環境為測試環境(application.properties)
spring.profiles.active=test# 指定運行環境為生產環境(application.xml)
spring:profiles:active: pord
此時,SpringBoot 首先默認會加載application.properties
文件,而這個的文件配置又告訴 SpringBoot 去找指定環境的配置文件。
🎯方式2:運行 jar 的時候指定
SpringBoot 內置的環境切換能夠在運行Jar
包的時候指定環境,命令如下:
java -jar xxx.jar --spring.profiles.active=test