SpringBoot(二)——配置檔案
SpringBoot使用一個全域性的配置檔案,作用是修改專案的預設值,配置檔名是固定的;application.properties/application.yml
一、yml
yml是以資料為中心的檔案,比xml、json更適合做配置檔案,不是標記語言。
1.語法
- 【key: value】表示鍵值對關係,冒號後面必須有一個空格;
- 使用空格的縮排表示層級關係,空格數目不重要,只要是左對齊的一列資料,都是同一個層級的,不允許【Tab】來縮排,只能用【空格】;
- 區分大小寫;
- 鬆散表示,java中對於駝峰命名法,可用原名或使用-代替駝峰,如java中的lastName屬性,在yml中使用lastName或 last-name都可正確對映;
- 只能單行註釋#
2.賦值
(1)字面量:字串預設不用加引號,加雙引號特殊字元不會轉義,加單引號會轉義
(2)日期:value以【/】分開,例如2020/06/21
(3)陣列:list和set中用【-】表示其中一個元素
(4)行內寫法:下一級用花括號{}圍起來,每個【key: value】之間用【,】隔開
(5)POJO類注入:
加上@Component註解表示是Spring元件,對映
加上@ConfigurationProperties告訴SpringBoot將本類中的所有屬性和配置檔案中相關的配置進行繫結,需要在pom.xml里加上依賴包spring-boot-configuration-processor(配置檔案處理器)。需要用字首(prefix = "person")指定全域性配置檔案下的person下層的屬性進行賦值,刪掉後不能成功賦值。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
對於該Person類與對應的yml配置檔案
@Component @ConfigurationProperties(prefix= "person")
@Data public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog; }
application.yml檔案
person:
last-name: 守林鳥
age: 22
boss: false
birth: 1998/11/02
maps: {country: 中國,city: 廣州}
lists:
- 乒乓
- 羽毛
- 騎行
dog:
name: 二哈
age: 3
#這是註釋
在測試類裡測試輸出
import com.lyj.demo.bean.Person; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.junit.jupiter.api.Test; @SpringBootTest class Test01ApplicationTests { @Autowired Person person; @Test public void testHello(){ System.out.println(person); } }
在實際開發中,資料基本都是從web層傳入,而不是在配置檔案中寫死,配置檔案一般用於連線資料庫等可以寫死的資訊,這裡只是記錄注入的語法規範。
二、properties
這是一種屬性檔案,也是以key-value的形式存值
(1)註釋#
(2)賦值以【.】的形式,也需要在Person類上面加上@ConfigurationProperties(prefix = "person")
#單行註釋
person.last-name=霸王別雞
person.age=23
person.boss=false
person.birth=1998/11/02
person.maps.country=中國
person.maps.city=廣州
person.lists[0]=乒乓
person.lists[1]=羽毛
person.lists[2]=打碼
person.dog.name=二哈
person.dog.age=3 #後續要比對
(3)idea亂碼問題
File->Settings...->Editor->File Encodings,預設編碼格式改為UTF-8,勾選後面的【Transparent native-to-ascii conversion】。
(4)與yml一起載入
如果兩個配置檔案同時存在,先載入yml檔案,再載入properties檔案,二者都有的屬性yml的會被覆蓋,如果僅yml有的屬性就不會被覆蓋,可以理解為properties優先順序更高,互補配置
(5)properties與yml檔案內容相互轉換的網址
https://www.toyaml.com/index.html
(6)@Value獲取值和@ConfigurationProperties獲取值比較
- 鬆散語法是指lastName可以以last-name的形式來賦值
- 校驗需要加上@Validated註解,校驗格式,例如屬性有@Email註解時,賦值需要是合法郵箱
- SpEL是指賦值#{11*2}這樣的表示式直接獲得結果22
(7)其他配置方法
@PropertySource:防止全域性application.properties配置檔案巨大,再開一個person.properties配置檔案來寫東西
@PropertySource(value = {"classpath:person.properties"}) @Component @ConfigurationProperties(prefix = "person")
@Data public class Person {
即使它看起來是灰色的,但也是可以識別的
(8)、poperties佔位符
- ${random.value}
- ${random.uuid}
- ${random.int(10)}
- ${random.int([min],[max])}
- ${random.long}
如果前面有一個屬性,例如person.last-name,寫了但沒有賦值(沒有接上=),後面用${person.last-name}獲取的時候當作空字串
如果屬性不存在例如person.last-nameeee,以前會報錯,現在是直接把整個【${person.last-name}】當作字串拼接;不想要這樣的話就加上冒號寫一個預設值
person.dog.name=${person.last-nameeee}dog #輸出:${person.last-nameeee}dog person.dog.name=${person.last-nameeee:霸王別雞的}dog #輸出:霸王別雞的dog
三、Profile
主配置檔案可以寫多個,適應各種不同的環境需要,預設的檔案是application.properties,其他的命名為application-{profile}.properties/yml
1.properties寫法
例如自定義application-dev.properties和application-prod.properties檔案,在預設檔案中加上這麼一句話就可以啟動其他的配置檔案
spring.profiles.active=dev
2.yml寫法
用文件分塊[---]的形式當作幾個不同的檔案,在最上面一個寫上啟用方式
server:
port: 8081
spring:
profiles:
active: dev #啟用
person:
last-name: 預設
---
server:
port: 8082
spring:
profiles: dev
person:
last-name: dev環境
---
server:
port: 8084
spring:
profiles: prod
person:
last-name: prod環境
dev指開發環境,prod或pro指生產環境,test指測試環境,pre指預釋出環境