1. 程式人生 > 實用技巧 >SpringBoot(二)——配置檔案

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指預釋出環境