spring-boot學習二:Spring boot配置相關內容

1.配置文件

1.1簡單介紹

spring boot默認會使用一個全局的配置文件,這個配置文件能夠是兩種格式的文件,一種是.properties,一種是.yaml格式的文件;而且配置文件的名字是固定的,要麼是application.properties,要麼是application.yaml;java

配置文件的做用:修改 Spring Boot配置的默認值,例如端口號等信息;spring

1.2YAML語法簡介

1.2.1簡介

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.2.2具體語法

【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]

 1.3從YAML配置文件注入屬性值

既然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);
    }

}

代碼運行結果以下:

 

1.4在.properties文件中去配置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註解的具體區別以下:

  • @configurationproperties註解能夠批量注入屬性,可是@Value只能一個個的注入屬性
  • @configurationproperties支持鬆散綁定,可是@Value不支持鬆散綁定;
  • @configurationproperties支持JSR303數據校驗,@Value不支持;
  • @configurationproperties不支持SpEl,可是@Value支持;
  • @configurationproperties支持複雜類型數據,例如map集合,可是@Value不支持;

因此:若是說咱們只是在業務邏輯中獲取一個業務的值。咱們就直接使用@Value註解便可;

    若是咱們專門編寫一個javaBean來和配置文件進行一一映射,這個時候就使用@Configurationproperties註解;

相關文章
相關標籤/搜索