1. 程式人生 > >SpringBoot學習-yaml介紹和yaml配置檔案值獲取

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 ''

    :單引號會轉義特殊字元,特殊字元最終只是一個普通的字串資料 name: ‘zhangsan \n lisi’:輸出;zhangsan \n 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-namelastName其實是一樣的 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-namelastName這種,代表的都一樣的 SpEL是@Value("#{11*2}")這種 資料校驗是指@Email這種 複雜型別是指map這種

如果說,我們只是在某個業務邏輯中需要獲取一下配置檔案中的某項值,使用@Value; 如果說,我們專門編寫了一個javaBean來和配置檔案進行對映,我們就直接使用@ConfigurationProperties;