一、YAML的语法
- 以数据为中心,比json、xml更适合做配置文件
1.YAML的基本语法
- 使用
缩进
表示层级关系
- 缩进时
不允许使用Tab键
,只允许使用空格
- 缩进时
空格数目
不重要,只要相同层次的元素左侧对齐
即可 大小写
敏感
YAML的写法
#YAML的写法
server
port: 8080
xml的写法
#xml的写法
<server>
<port>8081></port>
</server>
2.YAML支持的三中数据结构
对象:
键值对的集合数组:
一组按次序排列的值字面量:
单个的,不可再分的值
3.YAML的常用写法
- 对象(Map)
- 对象的一组键值对,使用冒号分割,例如
username: admin
- 冒号后面必须有
空格
来分开键值 {k: v}
常用写法
- 对象的一组键值对,使用冒号分割,例如
#YAML
persons:
username: zhangsan
age: 28
gender: boy
简化版,常用写法
persons: {username: zhangsan,age: 28,gender: boy}
- 数组
- 一组连词线(-)开头的行,构成一个数组,[]为行内写法
- 数组,对象可以组合使用
pets:
- cat
- dog
- pig
行内写法:
pets: [cat,dog,pig]
-
字面量
- 数字、字符串、布尔、日期
- 字符串
- 默认不使用引号
- 可以使用单引号或双引号,单引号会转义特殊字符
- 字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转义为空格。
-
文档
- 多个文档用
---
隔开
- 多个文档用
二、配置文件的注入
1.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.spring.boot</groupId>
<artifactId>springboot-fast</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-fast</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!--加载配置文件处理器的依赖,配置文件进行绑定时就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--单元测试的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!--Maven插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.Person类
//此注解将配置文件中的每一个属性的值都映射到这个组件中
//告诉SpringBoot将本类中所有属性和配置文件中相关的配置进行绑定
//prefix = "person"配置文件中哪个下面的属性进行一一映射
@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;
get()和set()、tostring()方法等
- Dog类
public class Dog {
private String name;
private Integer age;
get()和set()方法
3.配置文件
- application.properties
person.last-name=小可爱
person.age=18
person.boss=true
person.lists=a,b,c
person.maps.k1=1
person.maps.k2=2
person.birth=2019/10/20
person.dog.name=dog
person.dog.age=5
- application.yml
person:
lastName: zhangsan
age: 18
boos: false
birth: 2019/8/23
maps: {k1: v1,k2: v2,k3: v3}
lists:
- lisi
- lihua
- wentian
- gengfei
dog:
name: huahua
age: 9
4.测试类
package com.spring.boot.springbootfast;
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;
//springBoot的单元测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootFastApplicationTests {
@Autowired
private Person person;
@Test
public void contextLoads() {
System.out.println(person);
}
}
三、@Value()和@Configuration()的比较
ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个一个去指定 |
松散绑定 | zhic | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
- 无论配置文件是yml还是properties,都可以获取值
- 分情况来使用两种注解注入属性值
//这个类的所有方法返回的数据直接写给浏览器,如果是对象转为json数据
@RestController
public class HelloController {
//这种注入可以直接获取配置文件中的值
@Value("${person.last-name}")
private String name;
@RequestMapping("/sayHello")
public String hello() {
return "welcome "+name+" to JavaWorld!";
}
}