(Spring Boot教程三 )關於配置文件application.properties和application.yml理解

    之前我們使用的方法是通過IDEA中的maven創建方式進行Spring Boot項目搭建,主要是希望能夠通過手動加入必要的依賴,讓初學者對於Spring Boot項目中的依賴應用有一個更深入的瞭解。其實,我們還可以更加快速地搭建Spring Boot項目,只需要使用IDEA中的Spring Initializr創建項就可以,詳見Windows下IntelliJ IDEA搭建Spring Boot的簡單項目——超詳細圖解

目錄

一、基礎介紹

二、YAML語法和.properties文件語法

三、項目實踐

四、項目中出現的錯誤、原因及解決辦法


一、基礎介紹

     Spring Boot中使用全局配置文件對項目的默認配置進行修改,比如設置端口號。通常路徑爲“src->main->resources->application.properties”,如果你的項目是使用Spring Initializr創建項進行創建,那麼路徑就一定是這個。一般情況下,項目可以有多個配置文件,Spring Boot項目會把resources下的".properties"和".yml"文件讀入進行配置。

    但是,“.properties”文件的語法寫起來有很多重複,所以這裏推薦在這裏將“application.properties”替換成“application.yml”。“.yml”文件時YAML語言,這個語言以數據爲中心,更加容易編寫,更適合作爲配置文件。二者的語法都不難理解,這篇博客中會介紹到這兩種語法。

    以往我們主要使用.xml文件作爲配置文件,下面我們來對比一下這三種文件在配置端口號上有什麼語法上的不同,我們將端口號從默認的8080改成8081。

(1)xml文件,代碼如下:

<server>
    <port>8081</port>
</server>

(2)properties文件,代碼如下:

server.port=8081

(3)yml文件,代碼如下:

server:
    port: 8081

    可以看出xml的確在配置上需要更多的代碼。有的同學看到這裏覺得,.properties貌似比.yml更簡練,但是如果在對server的多個屬性進行配置時,yml差異就體現出來了。

二、YAML語法和.properties文件語法

1、YAML基本語法:基本有3點

(1)採用“key: value”的鍵值對形式進行設置,注意“:”和“value”之間必須使用空格隔開

(2)使用縮進表示層級關係,縮進使用空格而非TAB。空格多少無所謂,相同層級需要左對齊

(3)屬性和值的大小寫敏感

    其實我們使用IDEA的時候,第一點,如果你沒有在value前設置空格,關鍵字就是普通的黑色或者灰色,使用空格之後,就會變成關鍵字的橙色。第二點IDEA都會幫你完成,它會自動幫你縮進,並通過空格設置縮進的大小,通常使用兩個空格。只需要注意自己在編寫代碼的時候會不會不小心刪除空格就可以了。

2、YAML值的寫法,也就是我們value都可以填什麼類型的變量

(1)字面量:數字、字符串、布爾。通常數字直接寫就可以,布爾類型需要小寫(true/false),字符串使用單引號或者雙引號。如果使用單引號,輸出特殊字符時不會轉義,比如,'\n'輸出的內容就是\n;而雙引號則會轉義,“\n”輸出的內容就是一個回車。

(2)對象、Map:鍵值對。對象仍然使用“key: value”鍵值對的方式進行值的錄入,對象可作爲某個key的value。這樣說有點不方便理解,我們可以通過一個例子來更加形象地看出來。我們表示一個student類型,有兩種寫法,一種多行的,一種是行內的。行內寫法需要用大括號括起來。

#多行寫法
student:
  name: "Li Ming"
  age: 18
#單行的行內寫法
student: {name: "Li Ming",age: 18}

(3)數組:List、Set。與對象相似,同樣有單行和多行的寫法,多行用“- 值”的形式來表示數組中的一個元素,注意,值前同樣有一個空格;單行寫法不用“-”,使用中括號將所有值括起來,值之間使用“,”隔開。仍然舉個例子。

#多行寫法
person: 
  - man
  - women
#單行的行內寫法
person: [man,women]

3、.properties語法:.properties文件的編碼是ISO-8859-1,又稱爲Latin-1。從語法上來講,有前面的yaml語法作爲基礎知識,這裏就更容易理解。我們先在下面列出代碼,可以看出這裏使用“=”進行對“類.變量”賦值,賦值內容與yml一樣,都包括字面量、數組、對象。對於字面量中的字符串規則與yml一樣;而數組,我們這裏不需要使用“[]”,直接使用英文逗號隔開就可以;對象也可以作爲類的一個變量,同樣使用“.”將對象與對象裏的變量隔開。

student.name=zg
student.isfemale=true
student.birth=2014/4/1
student.teachers=Zhang, Liu
student.grade.English=89
student.grade.Math=100
student.pets.age=2
student.pets.spices=dog

4、當有多個配置文件時

(1).yml文件:.yml配置文件可以在四個位置,這裏以application.yml爲例。如下,按照優先級由高到低進行展示。也就是如果下面的四個文件夾分別有四個application.yml,其中都對一個bean的一個變量進行配置,系統會使用“項目主目錄->config->application.yml”內的數據。

  • 項目主目錄->config->application.yml
  • 項目主目錄->src->application.yml
  • 項目主目錄->src->main->resources->config->application.yml
  • 項目主目錄->src->main->resources->application.yml

   當我們需要在同一路徑下有多個YAML文件進行配置,那麼YAML文件的名字必須以“application”開頭,並以“-”進行連接,比如“application-student.yml”。並且我們需要在application.yml中對其他YAML文件進行聲明,這樣Spring Boot就知道我們要使用的YAML文件是什麼了。如果這類的配置文件與主配置文件applicaiton.yml產生衝突,以當前文件內容優先。

   聲明的代碼:

spring:
  profiles:
    include: student

(2).properties文件:與YAML文件相似,我們在一個項目中可以有多個.properties文件,但名字沒有限制。我們需要在類文件中類名前使用@PropertySource進行註解。舉個例子如果我們定義一個“student.properties”專門用於配置student的一些內容,那麼在Student.java裏我們需要加上註解,如下

//找到所有配置文件中以"student"開頭的內容進行配置
@ConfigurationProperties(prefix="student")
@PropertySource(value = {"classpath:student.properties"})
public class Student {

   @PropertySource可以幫助我們使用多個額外的.properties配置文件,具體的細節,請大家在我們的Spring Boot教程四中查看。

(3)如果賦值的內容需要隨機數或者需要其他項的值,我們可以使用“${}”來獲取,比如下面的代碼爲pets的age賦值一個隨機整數,並將teacher數組中的第一個值“zhang”放到pet的spices屬性中。

student:
  birth: 2019/04/11
  teachers: [zhang,wang]
  grade: {English: 87, Math: 100}
  pets:
    spices: ${student.teachers[0]}-dog
    age: ${random.int}

   random可以調用的方法以及他們的解釋有如下的幾種,基本上都是看到名字就能夠猜到他們是做什麼的:

  • random.int:隨機生成整數
  • random.int(value,max):在指定範圍隨機生成整數
  • random.long:隨機生成long型整數
  • random.long(value,max):在指定範圍隨機生成long型整數
  • random.uuid:隨機生成128位uuid隨機碼
  • random.value:隨機生成一個長度爲32的數字和小寫字母組成的一個字符串。

三、項目實踐

    下面我們將通過構建一個項目,來看一下Spring Boot如何在配置文件中自動爲Bean的屬性配置值。

1、首先我們需要快速構建一個Spring Boot項目。如果有的同學對這部分很熟,請跳過。

(1)新建項目,選擇Spring Initializr,確認項目的SDK是不是本地的你爲你的電腦配置的SDK。

(2)輸入Group和Artifact名字

(3)選擇模板進行添加,我們添加web模板

(4)刪除項目中不用的多餘的項,使項目結構更加地整潔。

(5)我們在項目中添加application.yml文件,打開src->main->resources目錄,右鍵點擊resources->new->File,輸入“application.yml”添加新的配置文件。這裏可以不用把application.properties文件刪除,因爲之後我們還將通過項目對這兩個文件進行相同操作從而進行對比。

(6)注意IDEA右下角的提示,選擇自動配置:

2、構建bean;在com.springboot.application下面新建一個bean文件夾,同時在這個文件夾下建立兩個類文件:Pet和Student。

(1)新建目錄和Pet可以同時進行,如下。

   

(2)然後新建Student。

(3)爲Pet.java和Student.java添加內容。先按照下面代碼爲Pet.java填充變量,然後自動填充get()、set()、toString()函數。方法是在代碼上右鍵->Generate->Getter and Setter和右鍵->Generate->toString

public class Pet {
    private String spices;
    private Integer age;
}

    同樣的方法,我們爲Student.java添加內容,因爲我們要通過這個文件比較全面地展示各種變量的使用,所以我們這裏設置的變量的類型多一點,沒有過多考慮是否符合實際需求。代碼如下,代碼填充結束後我們還是通過IDEA自動填充get()、set()、toString()函數。

public class Student {
    private String name;
    private Boolean isfemale;
    private Date birth;

    private List<Object> teachers;
    private Map<String, Object> grade;
    
    private Pet pets;

}

(3)對全局配置文件application.yml內容進行填充。內容如下,注意空格,注意大小寫。

student:
  name: zg
  isfemale: true
  birth: 2019/04/12
  teachers: [zhang teacher,wang teacher]
  grade: {English: 87, Math: 100}
  pets:
    spices: Dog
    age: 1

    如果你使用的是application.properties,則內容如下。

student.name=zg
student.isfemale=true
student.birth=2014/4/1
student.teachers=Zhang, Liu
student.grade.English=89
student.grade.Math=100
student.pets.age=2
student.pets.spices=dog

(4)爲Student.java添加配置屬性註解“@ConfigurationProperties(prefix = "student")”完成自動配置。這個註解主要是將配置文件中的數據與被註解的類的屬性進行綁定,“prefix”參數主要是用來定位配置文件中的數據的,這樣我們就可以知道,Student.java需要綁定的數據在配置文件中是以“Student”開頭的位置。

    這裏我圖片寫的“Student”,而文字教程中是“student”,以文字教程爲主。如果使用“Student”,IDEA標紅報錯,詳細的錯誤解釋即解決辦法等在教程末尾的錯誤修改1中。

    但是添加完,我們發現註解報紅。這是因爲我們沒有做相關引入和包的配置。

   首先,我們將鼠標放在上面,IDEA提示你按“Alt+Enter”,然後我們就能引入所提示的包。注意

(a)你的包可能因爲一些版本的原因包名與我不同,但是,基本的操作相同。

(b)可能你“Alt+Enter”之後不會引入包,會提示你幾個選擇,選擇“maven”開頭的那個,大概位置在第三個左右。然後你會進入一個包選擇的界面,選擇org.springframework的那個就可以了,具體我的全部配置文件見圖。

   但是我們的問題依然沒有解決,IDEA爲我們又進行提示,如下。大概就是類路徑下找不到註解。原因很簡單,我們沒有在pom文件中進行依賴注入,所以Spring Boot沒有自動下載這個包,當然找不到。怎麼注入?當然是操作pom文件。在pom文件中加入什麼?我們點開IDEA提示的文檔,選擇下圖中的“Open Documentation”

    打開後的界面如下:

    我們將“dependency”的內容複製一下,粘貼到項目中的<dependencies>下,然後就可以了。

    這個時候依然會有問題,報錯“Not registered via @EnableConfiguration Properties or marked as Spring component”,這是什麼意思呢?說明我們的這個@ConfigurationProperties註解只能註解Spring組件。知道問題在哪裏就好解決了,我們上一篇博客裏講解註解的時候講到一個註解是專門用來註冊組件的,是什麼?是@Component!答對了,我們只需要在Student前面加上註解@Component就可以啦!至於@Component在哪個包裏,前面我已經把所有包都列出來了,大家可以在那裏看一下。

    好了,現在沒有問題了。我們可以run一下主配置類,我這裏是application.java,發現沒有任何問題。

3、Test測試。打開“test->java->com.springboot.application->ApplicationTests”,我們爲其添加內容,使其如下面的代碼。其中,@AutoWired會幫助我們的變量與配置文件中的內容進行自動匹配。

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
    @Autowired
    Student student;

    @Test
    public void contextLoads() {
        System.out.println(student);
    }

}

    然後我們再Application Tests上右鍵啓動一下測試類

    執行結果如下:

四、項目中出現的錯誤、原因及解決辦法

1、@ConfigurationProperties(prefix="student")報錯“Prefix must be in canonical form”,因爲我們這裏prefix的參數必須使用駝峯命名法,全部小寫,單詞之間使用短橫線連接,把“Student”改成“student”就可以了。

2、在使用配置文件爲類注入值的時候,有的變量值沒有注入成功,顯示的爲null。如下:

問題原因還是在於命名,一開始我的配置文件和類變量設置如下:

   

首先,我們可以看到“isFEmale”後面的“false”沒有變成黃色,如果我們對應成功了,這裏的false是關鍵字,應該變色。如果我們把變量都改成小寫的,問題就可以解決了。

3、中文亂碼:在使用application.properties進行配置的時候,如果配置的內容中有中文字符串會出現亂碼的現象,具體的解決方法,請參考:使用application.properties配置文件造成的漢字亂碼問題解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章