什么是yaml
SpringBoot 使用了一个全局的配置文件,配置文件名称是固定的。
- application.properties
- 语法结构:key=value
- application.yaml
- 语法结构:key:空格value
配置文件的作用:修改 SpringBoot 自动配置的默认值。
yaml 语法
# 类似python,对缩进的要求十分严格
# yaml 可以注入到配置类中
# 存取普通的键值对
name: henjie
# 存取对象
student:
name: henjie
age: 23
# 行内写法
student1: {name: henjie,age: 23}
# 数组写法
Animal:
- Dog
- Cat
# 数组行内写法
Animal1: [cat,dog]
- yaml 可以直接给实体类赋值
4.1 为实体类赋值
创建实体类
创建Dog 和 Person 两个实体类
实体类上添加注解@ConfigurationProperties
如果没有配置,就没有提示,会报红,但是不影响程序的正常使用
配置方式导入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
依赖导入后,需要重启IDEA,便不会报红,且会有提示
@Component //将实体类注册到Spring组件(bean)中
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private boolean happy;
private Date brith;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}
- @ConfigurationProperties 作用:
- 将配置文件中配置的每一个属性的值,映射到这个组件中
- 告诉springboot将本类中的所有属性和配置文件中相关的配置进行绑定
- 参数prefix = “person” :将配置文件中的person下面所有的属性一一对应
- 只有这个类被注册到容器中成为了组件,才可以使用容器提供的此注解
配置yaml
Person:
name: 恨劫
age: 24
happy: true
birth: 1997/8/25
maps: {k1: v1,k2: v2}
lists:
- code
- music
- girl
dog:
name: 阿黄
age: 3
测试
@SpringBootTest
class ConfigApplicationTests {
@Autowired // 自动装配
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
输出:
Person(name=恨劫, age=24, happy=true, brith=null, maps={k1=v1, k2=v2}, lists=[code, music, girl], dog=Dog(name=阿黄, age=3))
4.2 SpEL 表达式
修改yaml
person:
name: 恨劫
age: ${random.int} # el表达式,生成一个随机数
happy: true
birth: 1997/8/25
maps: {k1: v1,k2: v2}
#hello: 大
lists:
- code
- music
- girl
dog:
name: ${person.hello:hello}_黄 # 如果变量hello存在则显示变量的值,不存在则显示hello_黄
age: 3
结果呈现
没有hello变量的情况
Person(name=恨劫, age=262138562, happy=true, brith=null, maps={k1=v1, k2=v2}, lists=[code, music, girl], dog=Dog(name=hello_黄, age=3))
有hello变量的情况
Person(name=恨劫, age=262138562, happy=true, brith=null, maps={k1=v1, k2=v2}, lists=[code, music, girl], dog=Dog(name=大_黄, age=3))
4.3 JSR303 校验
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
设置数据校验
@Validated //开启数据校验
public class Person {
@Email // 标注数据校验注解后,可以对属性设置相应的格式校验。
private String name;
}
@Validated
开启数据校验
@Email
设置name属性为email格式的校验。
执行测试
Property: person.name
Value: 恨劫
Origin: class path resource [application.yaml] - 2:9
Reason: 不是一个合法的电子邮件地址
- 出现报错,要求name的格式必须是一个电子邮件
可以修改报错的消息
@Email(message = "邮箱格式错误")
再次测试:
Property: person.name
Value: 恨劫
Origin: class path resource [application.yaml] - 2:9
Reason: 邮箱格式错误
4.4 配置文件位置
file:./config/
file 指项目路径,也就是springboot-02-config 优先级最高
file:./
也就是项目的根目录下直接创建 优先级其次
classpath:/config/
类路径下的config,就是java或者resources两个目录,一般是resources 优先级再次
classpath:/
就是默认创建的位置 优先级最低
4.5 多环境配置
使用 properties 配置
# springboot 多环境配置:可以选择激活哪一个配置文件
spring.profiles.active=dev
使用 yaml 配置
server:
port: 8081
spring:
profiles:
active: dev # 激活名为 dev 的配置文件
--- # 配置文件之间的分割
server:
port: 8082
spring:
profiles: dev # 为配置文件命名
---
server:
port: 8083
spring:
profiles: test