SpringBoot yaml配置注入


yaml配置注入

yaml, 也有人寫為yml, 讀音(鴨買哦) 官方格式為yaml

YAML(/ˈjæməl/,尾音類似camel駱駝)是一個可讀性高,用來表達數據序列化的格式。YAML參考了其他多種語言,包括:C語言、Python、Perl,並從XML、電子郵件的數據格式(RFC 2822)中獲得靈感。Clark Evans在2001年首次發表了這種語言,另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者。當前已經有數種編程語言或腳本語言支持(或者說解析)這種語言。這種語言以數據作為中心,而不是以標記語言為重點!

配置文件優先級properties>yaml>yml (文件名均為application)

在springboot中, 官方推薦使用yaml格式的配置文件來取代properties文件進行配置

  • properties文件格式: key=value

  • yml文件格式: key:空格value

  • 他們的注釋都是 #

配置文件可以用來修改springboot中已經配置好的默認值

和xml對比, 例如: (修改服務器端口號)

xml:

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

yaml:

server:
  prot: 8080

可見語法比xml更加簡潔, 更加直觀

yaml基礎語法

語法要求非常嚴格, 尤其是縮進, 規則如下:

  1. 空格不能省略
  2. 以縮進來控制層級關系,只要是左邊對齊的一列數據都是同一個層級的。
  3. 屬性和值的大小寫都是十分敏感的。

字面量: 普通值(數組, 布爾, 字符串)

字面量可以直接寫而不需要加雙引號

K: V

注意:

  • “ ” 雙引號,會轉義字符串里面的特殊字符 , 特殊字符會作為本身想表示的意思;

    比如 :name: "123 \n 456" 輸出 :123 換行 456

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

    比如 :name: ‘123\n 456’ 輸出 :123 \n 456

對象, Map類型 (鍵值對)

對象和Map的格式有如下兩種方式, 寫法一致

o: 
    k1: v1
    k2: v2

第一行o是對象名或者map的變量名, 如果下面的k1, k2想和對象或者map建立關系, 必須有縮進

例如: student對象

student:
    name: 張三
    age: 3

集合: 例如Map map = new HashMap();

map:
	k1: v1
	k2: v2

即最終map中會出現兩個鍵值對

當然, 對象和map集合還有一種行內的寫法, 如下:

student: {name: zhangsan, age: 3}
map: {k1: v1, k2: v2}

數組 (list and set)

- (減號)值表示數組中的一個元素,比如:

pets:
 - cat
 - dog
 - pig

行內寫法:

pets: [cat,dog,pig]

yaml注入案例

1.新建person類:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@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;
}

@Component 注解是把person對象交給spring管理

@ConfigurationProperties(prefix = "person") 次注解是注入配置文件(application.properties)中的對象, prefix為指定的對象

@ConfigurationProperties作用:
將配置文件中配置的每一個屬性的值,映射到這個組件中;
告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定參數 
prefix = “person” : 將配置文件中的person下面的所有屬性一一對應

2. yaml文件內容:

person:
  name: 張pk
  age: 21
  happy: false
  birth: 1999/01/01
  maps: {k1: v1, k2: v2}
  lists:
    - code
    - girl
    - music
  dog:
    name: 旺財
    age: 5

3. 出現提示:

IDEA 提示,springboot配置注解處理器沒有找到,讓我們看文檔,我們可以查看文檔,找到一個依賴!

根據提示, 打開對象的網站, 上面說需要導入一個依賴

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

4. 測試

@SpringBootTest
public class MyTest2 {
	@Autowired
    private Person person;

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

結果:

Person(name=張pk, age=21, happy=false, birth=Fri Jan 01 00:00:00 CST 1999, maps={k1=v1, k2=v2}, lists=[code, girl, music], dog=Dog(name=旺財, age=5))

正常輸出

加載指定配置文件

@PropertySource :加載指定的配置文件;

@configurationProperties:默認從全局配置文件(application)中獲取值;

讀取其他yaml文件

讀取其他文件 (yaml)

1. 新建配置文件

我們去在resources目錄下新建一個student.yaml文件

student:
  name: 李四
  age: 45
  sex: 男

2. 加載配置文件(student類)

@Data
@AllArgsConstructor
@NoArgsConstructor
@PropertySource("classpath:student.yaml")
@Component
public class Student {
    @Value("${name}")
    private String name;
    @Value("${age}")
    private Integer age;
    @Value("${sex}")
    private String sex; // 性別
}

測試並結果正常輸出

讀取其他properties文件

讀取其他文件 (properties)

1. 新建配置文件

student.properties文件

student.name=李四
student.age=45
student.sex=男

2. 加載配置文件(student類)

@Data
@AllArgsConstructor
@NoArgsConstructor
@PropertySource("classpath:student.properties")
@Component
public class Student {
    @Value("${student.name}")
    private String name;
    @Value("${student.age}")
    private Integer age;
    @Value("${student.sex}")
    private String sex; // 性別
}

讀取其他文件對比

讀取yaml的時候不需要寫對象名字student

讀取properties的時候必須寫全key的名字才可以

配置文件占位符

例如:

person:
	...
	age: 21
	...

son:
    uuid: UUID:${random.uuid}  # 隨機的uuid
    randomInt: ${random.int(8)}  #隨機數, 最大值為8, 也可以寫${random.int}
    randomLong: ${random.long(3)}  # 隨機long值, 也可以寫${random.long}
    other: ${person.age:other}_其他值  # 如果有person的age對象, 結果就是[對象值+_其他值], 如果沒有就是[other_其他值]

Son類:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "son")
public class Son {
    private String uuid;
    private Integer randomInt;
    private Long randomLong;
    private String other;
}

結果:

Son(uuid=UUID:518d1151-4154-479b-926f-040b86a00cf3, randomInt=6, randomLong=2.0, other=21_其他值)

擴展: springboot讀取配置文件

yml(同properties)

前提都得是spring的默認配置文件(文件名為application)

配置文件

# application.yml
jdbc:
  username: root
  password: root

直接使用@Value注解

@RestController
public class JDBCController {

	@Value("${jdbc.username}")
	private String username;
	@Value("${jdbc.password}")
	private String password;
    
}

批量賦值

批量賦值即不需要我們使用@Value注解一個一個對屬性進行指定

需要引入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

例如配置文件

# application.yml
jdbc:
  username: root
  password: root

使用@ConfigurationProperties注解

類, (前提已交給spring管理)

為屬性賦值時, 一定會調用屬性的set方法

@RestController
@ConfigurationProperties(prefix = "jdbc") // 配置前綴, 類屬性與配置文件中去掉前綴的屬性名一致
public class JDBCController2 {
	// 批量為屬性賦值時, 要求配置文件的屬性與類中的屬性名稱一致
	private String username;
	private String password;
	// getter, setter...
}

指定其他配置文件

其他配置文件(例如: jdbc.properties)

# jdbc.properties
jdbc.username=root
jdbc.password=root

使用@PropertySource注解, 引入指定配置文件

@PropertySource("classpath:/jdbc.properties")
@RestController
public class JDBCController {

	@Value("${jdbc.username}")
	private String username;
	@Value("${jdbc.password}")
	private String password;
    
}

yml無需擔心亂碼問題.

注意讀取配置文件中的中文會出現亂碼, 需要在@PropertySource 注解中加入encoding屬性, 使讀取文件的時候使用utf-8的格式讀取文件, (前提是properties的編碼也為utf-8), 如下:

@PropertySource(value = "classpath:/properties/jdbc.properties", encoding = "UTF-8")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM