spring boot默認會使用一個全局的配置文件,這個配置文件能夠是兩種格式的文件,一種是.properties,一種是.yaml格式的文件;而且配置文件的名字是固定的,要麼是application.properties,要麼是application.yaml;java
配置文件的做用:修改 Spring Boot配置的默認值,例如端口號等信息;spring
YAML:(YAML Ain't Markup Lanuage),這個叫法有兩層含義:json
YAML A Markup Lanuage:YAML就是一個標記語言;數組
YAML isn't Markup Lanuage:YAMA不是一個標記語言;springboot
YAML以數據爲中心,比json.xml更適合作配置文件;app
好比咱們想改變spring boot 啓動的端口信息,咱們在application.properties文件中的語法以下所示:ide
server.port=8971
可是在application.yaml文件中的語法以下所示:spring-boot
server:
port: 8089
固然若是一樣的工做咱們在XML文件中進行配置,語法以下:單元測試
<server> <port>8089</port> </server>
【1】k:(空格)v:表示一對鍵值對(空格必須有),以空格的縮進來控制層級關係;只要是左對齊的一列數據,都是同一層級的;
測試
server:
port: 8089
error:
path: /hello
其中server爲第一層級,port和error屬於同一個層級,path單獨屬於一個層級;
還須要注意的是,yaml文件中的屬性和值大小寫敏感;
【2】值的寫法
即在yaml文件中均可以寫入哪些值,咱們常見的值類型以下:
第一類:字面量,普通的值(數字、字符串、布爾)
k: v:字面直接來寫,尤爲對於字符串類型不須要加入雙引號,若是加上雙引號有特殊含義,會將字符串中的特殊字符進行專義輸出,例如輸出"ab \n c",輸出:
ab
c
若是加的是單引號,那麼特殊字符將會被原樣輸出,例如:'ab \n c' 輸出就是:
ab \n c
第二類:對象、map(屬性和值)(鍵值對);
k: v:在下一行來寫對象的屬性和值的關係,注意縮進;例如咱們如今有個類User,裏面有屬性name和age寫法以下:
user:
name: haige
age: 20
上述的寫法還等價於下面這種行內寫法:
User{name: haige,age: 20}
第三類:集合數組(List、Set);
用-值表示數組中的一個元素,例以下面有個集合pets,裏面有集合原素:pig、dog、cat寫法以下:
pets:
-pig
-dog
-cat
述的寫法還等價於下面這種行內寫法:
pets: [pig,cat,dog]
既然YAML配置文件這麼方便,那咱們須要學會從YAML文件中讀取屬性。下面經過一個實例進行演示;
具體步驟以下所示:
【1】第一步:聲明一個類Person,裏面有屬性name、age、map集合、list集合,對象等屬性;
package com.hai.bao.springboot01; import java.util.Date; import java.util.List; import java.util.Map; /** * @author :haibao.wang * @date :Created in 2019/8/29 22:20 * @description:person類 * @modified By: * @version: $ */ public class Person { private String name; private int age; private boolean boss; private Date birth; private Map<String, Object> maps; private List<Object> lists; private Dog dog; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isBoss() { return boss; } public void setBoss(boolean boss) { this.boss = boss; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public Map<String, Object> getMaps() { return maps; } public void setMaps(Map<String, Object> maps) { this.maps = maps; } public List<Object> getLists() { return lists; } public void setLists(List<Object> lists) { this.lists = lists; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", boss=" + boss + ", birth=" + birth + ", maps=" + maps + ", lists=" + lists + ", dog=" + dog + '}'; } }
在Person類裏面有一個Dog類的屬性,Dog類以下:
package com.hai.bao.springboot01; /** * @author :haibao.wang * @date :Created in 2019/8/29 22:23 * @description:新建一個小狗類 * @modified By: * @version: $ */ public class Dog { private String dogName; private int dogAge; public String getDogName() { return dogName; } public void setDogName(String dogName) { this.dogName = dogName; } public int getDogAge() { return dogAge; } public void setDogAge(int dogAge) { this.dogAge = dogAge; } }
【2】在application.yaml文件中配置Person類中相關屬性的值;
server:
port: 8089
person:
name: 海哥
age: 18
boss: true
birth: 1990/05/27
maps:
key01: 化學
key02: 物理
lists:
- 跑步
- 游泳
dog:
dogName: 旺財
dogAge: 3
【3】此時在Person類中有提示信息:
此時須要在pom.xml文件中添加配置文件處理器,以下依賴;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
【4】給Person類加上@ConfigurationProperties(prefix = "Person")註解。告訴Spring boot將本類中的全部屬性和配置文件中的配置信息一一綁定;
【5】給Person類加上容器的註解,確保組件在容器中,纔可以使用@ConfigurationProperties註解;
【6】啓動Spring boot服務;
【7】寫一個Spring boot的單元測試類,來驗證下功能:
package com.hai.bao; import com.hai.bao.springboot01.Person; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class BaoApplicationTests { @Autowired Person person; @Test public void contextLoads() { System.out.println(person); } }
代碼運行結果以下:
#配置Person類中相關的屬性值 person.age=10 person.birth=1990/05/01 person.boss=true person.maps.key01=數學 person.maps.key02=化學 person.lists=瑜伽,游泳 person.dog.dogName=旺財 person.dog.dogAge=2
啓動後執行單元測試,測試結果以下:
有亂碼,由於IDEA原生的編碼格式爲utf-8,解決亂碼問題的方法以下:
File-settings-File Encodings
@configurationproperties註解和@Value註解的具體區別以下:
因此:若是說咱們只是在業務邏輯中獲取一個業務的值。咱們就直接使用@Value註解便可;
若是咱們專門編寫一個javaBean來和配置文件進行一一映射,這個時候就使用@Configurationproperties註解;