1.写在前面
我们都知道SpringBoot项目都有一个核心配置文件叫 application.xxx,这个xxx后缀名可以有三种类型:properties、yml、yaml,这里可能我理解的不太精确,我认为 yml 和 yaml 没什么区别。
YAML是 "YAML Ain't Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。非常适合用来做以数据为中心的配置文件。
properties就不用多说了,之前都经常写,就是这种 a.b.c=xxx 形式。
如果转换成 yml,就需要写成:
a:
b:
c:xxx 这种形式。它也有一定的基本语法:
· key: value;kv之间有空格
· 大小写敏感
· 使用缩进表示层级关系
· 缩进不允许使用tab,只允许空格(在IDEA中只所以 tab 没问题,是因为IDEA自动将 tab 转为了4个空格)
· 缩进的空格数不重要,只要相同层级的元素左对齐即可
· '#' 表示注释
· 字符串无需加引号,如果要加,''与""表示字符串内容会被转义/不转义
·
字面量:单个的、不可再分的值。date、boolean、string、number、null
k: v
· 对象:键值对的集合。map、hash、set、object
行内写法: k: {k1:v1,k2:v2,k3:v3} #或 k: k1: v1 k2: v2 k3: v3
· 数组:一组按次序排列的值。array、list、queue
行内写法: k: [v1,v2,v3] #或者 k: - v1 - v2 - v3
下面,通过一个案例,来分别演示一下 properties 和 yml 的写法。
2.项目源码
首先,这是一个 springboot web项目,依赖如下:👇👇👇
分别添加的 web 项目起步依赖、lombok简化开发。
我们在之前配置文件中写 spring.application.name、spring.datasource.url 这些官方的配置都有提示,但是自定义的类和配置文件绑定一般没有提示。要有提示可以添加 pom 文件中的最后一个依赖以及build中的插件即可。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build>
下面我们写两个实体Bean,其中有各自的属性信息。
在Person类中 @Data 自动生成getter/setter、toString、hashCode、equals等等这些方法,@Component将其添加到IoC容器中,@ConfigurationProperties将与配置文件完成属性前缀为 person 的绑定。
package com.szh.boot.bean; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; /** * */ @Data @Component @ConfigurationProperties(prefix = "person") public class Person { private String userName; private Boolean boss; private Date birth; private Integer age; private Pet pet; private String[] interests; private List<String> animal; private Map<String, Object> score; private Set<Double> salary; private Map<String, List<Pet>> allPets; }
package com.szh.boot.bean; import lombok.Data; /** * */ @Data public class Pet { private String name; private Double weight; }
然后再写一个controller。
package com.szh.boot.controller; import com.szh.boot.bean.Person; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * */ @RestController @Slf4j public class TestController { @Autowired private Person person; @GetMapping(value = "/getInfo") public Person getInfo() { return person; } }
项目启动类的代码我就不贴了,下面给出 properties、yml 两种配置文件的写法。
2.1 properties
person.user-name=张起灵 person.boss=true person.birth=2020/09/10 13:14:15 person.age=18 person.pet.name=金毛犬 person.pet.weight=13.14 person.interests=[篮球,足球,排球] person.animal[0]=Dog person.animal[1]=Pig person.animal[2]=Cat person.score.Chinese[0]=98 person.score.Chinese[1]=99 person.score.Chinese[2]=100 person.score.Math.first=60 person.score.Math.second=65 person.score.Math.third=70 person.score.English.do=11 person.score.English.does=22 person.score.English.did=33 person.score.History[0]=Han Dynasty person.score.History[1]=Tang Dynasty person.score.History[2]=Qing Dynasty person.salary[0]=5555 person.salary[1]=6666 person.salary[2]=7777 person.all-pets.sick[0].name=牧羊犬 person.all-pets.sick[0].weight=20.5 person.all-pets.sick[1].name=导盲犬 person.all-pets.sick[1].weight=18.1 person.all-pets.health[0].name=藏獒 person.all-pets.health[0].weight=44.4 person.all-pets.health[1].name=萨摩耶 person.all-pets.health[1].weight=28.5
不得不说,我写了那么久的 proeprties,一直觉得这种格式挺舒服的,但是这次我错了,必须承认 yml 要强于 properties 了。
2.2 yml
person: user-name: 张起灵 boss: true birth: 2020/09/10 13:14:15 age: 18 pet: name: 金毛犬 weight: 13.14 interests: [篮球,足球,排球] animal: - Dog - Pig - Cat score: Chinese: [98,99,100] Math: first: 60 second: 65 third: 70 English: {do: 11, does: 22, did: 33} History: - Han Dynasty - Tang Dynasty - Qing Dynasty salary: [5555,6666,7777] all-pets: sick: - {name: 牧羊犬, weight: 20.5} - {name: 导盲犬, weight: 18.1} health: [{name: 藏獒, weight: 44.4},{name: 萨摩耶, weight: 28.5}]
对比两种形式,明显感觉到 yml 整体看起来要比 properties 舒服多了。
下面启动项目测试一下。