SpringBoot-配置文件相關(五)

SpringBoot-配置文件

SpringBoot官方文檔html

配置相關java

SpringBoot使用一個全局的配置文件 , 配置文件名稱是固定的spring

  • application.properties
    • 語法結構 : key=value
  • application.yml
    • 語法結構 :key:空格 value

配置文件的做用 :修改SpringBoot自動配置的默認值,由於SpringBoot在底層都給咱們自動配置好了;數組

YAML

YAML是 "YAML Ain't a Markup Language" (YAML不是一種置標語言)的遞歸縮寫。springboot

在開發的這種語言時,YAML 的意思實際上是:"Yet Another Markup Language"(還是一種置標語言)app

YAML A Markup Language :是一個標記語言dom

YAML isnot Markup Language :不是一個標記語言spring-boot

標記語言測試

之前的配置文件,大多數都是使用xml來配置;好比一個簡單的端口配置,咱們來對比下yaml和xmlui

yaml配置:

server:
    prot: 8080

xml配置:

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

YAML語法

基礎語法:

k:(空格) v

以此來表示一對鍵值對(空格不能省略);以空格的縮進來控制層級關係,只要是左邊對齊的一列數據都是同一個層級的。

注意 :屬性和值的大小寫都是十分敏感的。例子:

server:
    port: 8081
    path: /hello

值的寫法

字面量:普通的值 [ 數字,布爾值,字符串 ]

k: v

字面量直接寫在後面就能夠 , 字符串默認不用加上雙引號或者單引號;

「」 雙引號,不會轉義字符串裏面的特殊字符 , 特殊字符會做爲自己想表示的意思;

好比 : name: "bao\n sq" 輸出 : bao換行 sq

'' 單引號,會轉義特殊字符 , 特殊字符最終會變成和普通字符同樣輸出

好比 : name: ‘bao\n sq’ 輸出 : bao\n sq

對象、Map(鍵值對)

k: 
    v1:
    v2:

在下一行來寫對象的屬性和值得關係,注意縮進;好比:

student:
    name: bao
    age: 3

行內寫法

student: {name: bao,age: 3}

數組( List、set )

用 - 值表示數組中的一個元素,好比:

pets:
 - cat
 - dog
 - pig

行內寫法

pets: [cat,dog,pig]

修改SpringBoot的默認端口號

配置文件中添加,端口號的參數,就能夠切換端口;

server.port=8081

注入配置文件

程序實現

1. 若是要使用properties配置文件可能導入時存在亂碼現象 , 須要在IDEA中進行調整 , 咱們這裏直接使用yml文件 , 將默認的 application.properties後綴修改成yml

img

2. 導入配置文件處理器

<!--導入配置文件處理器,配置文件進行綁定就會有提示-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

3.編寫yml 配置文件

person:
    name: bao
    age: 3
    happy: false
    birth: 2005/01/01
    maps: {k1: v1,k2: v2}
    lists:
      - code
      - girl
      - music
    dog:
      name: 旺財
      age: 1

4.在SpringBoot的主程序的同級目錄下建包,只有這樣,主程序纔會對這些類生效 ; 咱們建一個pojo的包放入咱們的Person類和Dog類;

package com.bao.springbootdemo03.pojo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;


/*
@ConfigurationProperties做用:
將配置文件中配置的每個屬性的值,映射到這個組件中;
告訴SpringBoot將本類中的全部屬性和配置文件中相關的配置進行綁定
參數 prefix = 「person」 : 將配置文件中的person下面的全部屬性一一對應

只有這個組件是容器中的組件,才能使用容器提供的@ConfigurationProperties功能
*/
@Component //註冊bean
@ConfigurationProperties(prefix = "person")
public class Person {

    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

    //get,set方法
    //toString方法
    
}

記得寫上 toString()方法,方便調試輸出結果

package com.kuang.springbootdemo03.pojo;

public class Dog {
    private String name;
    private Integer age;
    
    //get、set方法
    //toString()方法  
}

5.確認無誤後,到測試單元中進行測試,看是否注入成功!

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootDemo03ApplicationTests {

    @Autowired
    Person person ;

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

}

JSR303數據校驗

spring-boot中能夠用@validated來校驗數據,若是數據異常則會統一拋出異常,方便異常中心統一處理。咱們這裏來寫個註解讓咱們的name只能支持Email格式

@Component //註冊bean
@ConfigurationProperties(prefix = "person")
@Validated  //數據校驗
public class Person {

    //@Value("${person.name}")
    @Email //name必須是郵箱格式
    private String name;
}

運行結果
會報郵箱格式的錯誤

使用數據校驗,能夠保證數據的正確性;

加載指定配置文件

1. @PropertySource :加載指定的配置文件;使用@configurationProperties默認從全局配置文件中獲取值;

咱們去在resources目錄下新建一個person.properties文件

name=baobao

而後在咱們的代碼中指定加載person.properties文件

@PropertySource(value = "classpath:person.properties")
@Component //註冊bean
public class Person {

    @Value("${name}")
    private String name;

    ......  
}

配置文件佔位符

隨機數

${random.value}、${random.int}、${random.long}、${random.int(10)}等等

佔位符引用其餘屬性的值,若是不存在能夠設置默認值

person:
    name: bao${random.uuid}
    age: ${random.int}
    happy: false
    birth: 2010/02/01
    maps: {k1: v1,k2: v2}
    lists:
      - code
      - girl
      - music
    dog:
      name: ${person.hello:hello}_狗子
      age: 1
相關文章
相關標籤/搜索