SpringBoot學習-yaml介紹和yaml配置檔案值獲取
yaml簡介
SpringBoot使用一個全域性的配置檔案,也就是下面這兩個中的任意一個SpringBoot都會把它當做配置檔案,配置檔名是固定的
- application.properties
- application.yml 配置檔案的作用:修改SpringBoot自動配置的預設值;SpringBoot在底層都給我們自動配置好;
YAML(YAML Ain’t Markup Language)yaml和yml這兩個字尾是一樣的
- YAML A Markup Language:是一個標記語言
- YAML isn’t Markup Language:不是一個標記語言;
以前的配置檔案;大多都使用的是 xxx.xml檔案;
- YAML:以資料為中心,比json、xml等更適合做配置檔案;
- YAML:配置server埠號例子,新建一個application.yml,放在resources資料夾下
server:
port: 8082
yaml語法
基本語法
k:(空格)v
:表示一對鍵值對(空格必須有);
以空格的縮排來控制層級關係;空格多少無所謂,但是隻要是左對齊的一列資料,都是同一個層級的
屬性和值也是大小寫敏感
值的寫法
-
字面量:普通的值(數字,字串,布林)
k: v
:字面直接來寫; 字串預設不用加上單引號或者雙引號;""
:雙引號不會轉義字串裡面的特殊字元;特殊字元會作為本身想表示的意思 name: “zhangsan \n lisi”:輸出;zhangsan 換行 lisi''
-
物件、Map(屬性和值)(鍵值對) k: v:在下一行來寫物件的屬性和值的關係;注意縮排 比如有個friends物件,裡面有兩個屬性name和age
friends:
name: zhangsan
age: 20
還有一種行內寫法
friends: {name: zhangsan,age: 20}
- 陣列(List、Set)
用
- 值
(-+空格+值)表示陣列中的一個元素
pets:
‐ cat
‐ dog
‐ pig
行內寫法:
pets: [cat,dog,pig]
yml配置檔案的值獲取
獲取方法一:用@ConfigurationProperties獲取
@ConfigurationProperties的作用是告訴SpringBoot將本類中的所有屬性和配置檔案中相關的配置進行繫結 prefix = "Person"代表配置檔案中Person下面的所有屬性進行一一對映 @ConfigurationProperties預設從全域性的配置檔案中獲取值 person類
package com.nyh.springboot.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author nyh
* @create 2018-10-12 15:20
**/
/*
* 將yml配置檔案中配置的每一個值對映到這個javabean元件中
* @ConfigurationProperties的作用是告訴SpringBoot將本類中的所有屬性和配置檔案中相關的配置進行繫結
* prefix = "Person"代表配置檔案中Person下面的所有屬性進行一一對映
* 只有這個元件是容器中的元件,才能使用容器提供的@ConfigurationProperties功能
* 所以要加上@Component註解
* */
@Component
@ConfigurationProperties(prefix = "person")
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;
@Override
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", boss=" + boss +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getBoss() {
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;
}
}
yml程式碼提示
寫完後你會發現IDE中有個警告提示: 點選連結會跳轉到官方文件中,讓我們依賴一個配置檔案處理器,作用是生成配置檔案的一些元資料資訊,有了它我們在配置檔案中寫程式碼就會有相應的提示了
<!--匯入配置檔案處理器,配置檔案繫結就會有程式碼提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
匯入完成後重新執行一下SpringBoot就可以了(就是重新執行主程式)
然後就會有提示了
last-name
和lastName
其實是一樣的
dog類:
package com.nyh.springboot.bean;
/**
* @author nyh
* @create 2018-10-13 8:23
**/
public class Dog {
//
private String name;
private Integer age;
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
在yml中寫對應的屬性: person要小寫,別問我為什麼知道…
person:
lastName: nyh
age: 20
boss: false
birth: 2018/09/09
maps: {k1: v1,k2: v2}
lists:
- lisi
- zhaoliu
dog:
name: 小白
age: 2
在yml中寫屬性如果寫對了的話會下面的導航會有提示的
相同的配置也可以寫在 application.properties
中,隨便你喜歡
person.last-name=張三
person.age=18
person.birth=2018/09/09
person.boss=false
person.maps.k1=v1
person.maps.k2=90
person.lists=a,b,c
person.dog.name=小白
person.dog.age=2
application.properties中文亂碼問題
兩種配置都可以用@ConfigurationProperties(prefix = "person")
獲取到的
用application.properties
時可能會出現中文亂碼的問題,按照下圖方式修改就可以了
SpringBoot的單元測試
第二種獲取方法:@Value
@Value獲取值和@ConfigurationProperties獲取值比較
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置檔案中的屬性 | 一個個指定 |
鬆散繫結(鬆散語法) | 支援 | 不支援 |
SpEL | 不支援 | 支援 |
JSR303資料校驗 | 支援 | 不支援 |
複雜型別封裝 | 支援 | 不支援 |
鬆散語法是指last-name
和lastName
這種,代表的都一樣的
SpEL是@Value("#{11*2}")
這種
資料校驗是指@Email
這種
複雜型別是指map
這種
如果說,我們只是在某個業務邏輯中需要獲取一下配置檔案中的某項值,使用@Value; 如果說,我們專門編寫了一個javaBean來和配置檔案進行對映,我們就直接使用@ConfigurationProperties;