文章目录
前言
1.yaml语法讲解
1.1.yam和properties配置文件对比+ .yaml使用
1.2.yaml配置文件语法
1.3.yaml配置文件的赋值操作
1.4 扩展:.yaml方式给实体类赋值(配置随机值或默认值)
1.5 @Value和@ConfigurationProperties注解区别
2.松散绑定与JSR303数据校验
2.1 松散绑定使用案例
2.2 JSR303数据校验及常见校验参数
3.多环境配置及配置文件位置
3.1 配置文件的存放位置优先级
3.2 多环境下多个配置文件的切换
3.3. ym和properties配置文件同时使用情况
前言
本章主要说明:.yml和properties 两种配置文件的使用 + 存取值 + 多配置文件使用…
1. yaml语法讲解
1.1 .yaml和.properties配置文件对比 + .yaml使用
1. 一般配置文件application的后缀有两种方式:官方推荐properties
⑴ 方式一:application.properties
语法结构 :key=value
⑵ 方式二:application.yml
语法结构 :key:空格 value
2. .yaml 存储 与.properties 存储对比
⑴ .yaml可以存储多种形式,而.properties仅可以存储键值对形式。
⑵ 以下演示.yaml存储数据的几种形式
==.yaml配置文件,如下所示↓:==
# 更改项目的端口号
server:
port: 8081
# 存储普通的键值对
name: linaa
# 存储一个对象
student:
name: linaa
age: 13
# 存储一个对象(行内写法)
student2: {name: linzk2,age: 14}
# 存储一个数组
pets:
- cat
- dog
- pig
# 存储一个数组(行内写法)
pets2: {cat2,dog2,pig2}
1.2 .yaml配置文件语法
1. yaml基础语法
⑴ 空格不能省略
⑵ 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级
的。
⑶ 属性和值的大小写都是十分敏感的。
1.3 .yaml配置文件的赋值操作
1. yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值!
⑴ 给实体类赋值有三种方式:
- 方式一:@Value --->以前的用法
- 方式二:@ConfigurationProperties --->现在的用法
- 方式三:@PropertySource --->加载指定的配置文件(此方式需要利
- 用@Value来获取配置文件中的值);
⑵ 以上三种方式精通一种即可!
1.3.1 方式一:使用@Value注解直接给实体类一个个赋值
1. 使用@Value注解赋值,演示如下
⑴ 创建一个Dog实体类,并利用@Value注解给属性赋值。
@Component //注册bean
@Getter
@Setter
@ToString
public class Dog {
@Value("旺财")
private String name;
@Value("18")
private Integer age;
}
⑵ 在SpringBoot的测试类下,测试使用@Value注入Dog值后的输出情况
@SpringBootTest
public class DemoApplicationTests {
@Autowired //将狗狗自动注入进来
private Dog dog;
@Test
public void contextLoads() {
System.out.println(dog); //打印看下狗狗对象
}
}
↑运行以上程序,输出使用@Value注解给Dog赋值的值,如-"图p1"
图p1
1.3.2 方式二:使用@ConfigurationProperties注解给实体类赋值
1. 使用.yaml给实体类赋值
⑴ 创建一个实体类Person
@Component //注册bean到容器中,实现被Spring被扫描到
@Getter
@Setter
@ToString
/**
* @ConfigurationProperties(prefix = "person")
* -->这里面的(prefix = "person")是配置文件中值对应的前缀为
* person,属于配置文件中的层级名称,而不是配置文件名称。
*
* -->表示通过ConfigurationProperties将里面的person参数
* -->与.yaml里面的person下面的参数配置绑定起来,
* -->绑定起来这个实体类Person就有注入的值了
*/
@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;
}
⑵ 在.yaml配置中设置person的值
person:
name: linaa
age: 13
birth: 2020/11/14
maps: {k1: v1, k2: v2}
lists:
- code
- music
- girl
dog:
name: 旺财
age: 3
⑶ 测试
/**
* 使用以下测试类来测试
*/
@SpringBootTest
public class SpringbootApplicationTests {
@Autowired
private Person person;
@Test
public void test1() {
System.out.println(person);
}
}
↑运行以上test1()方法,查看是否输出.yaml设置的值。
② 以上@ConfigurationProperties注解作用↓:
/* @ConfigurationProperties作用:
* 将配置文件中配置的每一个属性的值,映射到这个组件中;
* 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定参数 prefix = “person” :
* 将配置文件中的person下面的所有属性一一对应
*/
1.3.3 方式三:@PropertySource + @Value 加载指定的配置文件给实体类赋值
1. 任意命名一个,以.rpoperties结尾的配置文件,并在实体类上指定要将此配置文件读取
到指定的实体类上,并给该实体类赋值,但是注意给实体类赋值还要加上@Value注解要注入进去才可以实现赋值。
⑴ 我们去在resources目录下新建一个person.properties文件
name=linaa
⑵ 然后在我们的代码实体类中指定加载person.properties文件
@PropertySource(value = "classpath:person.properties")
@Component //注册bean
@Getter
@Setter
@toString
public class Person {
@Value("${name}")
private String name;
}
⑶ 再次输出测试一下:指定配置文件绑定成功
/**
* 使用以下测试类来测试
*/
@SpringBootTest
public class SpringbootApplicationTests {
@Autowired
private Person person;
@Test
public void test1() {
System.out.println(person);
}
}
以上测试运行结果:
Person(name = linaa)
1.4 扩展:.yaml方式给实体类赋值(配置随机值或默认值)
1. 配置文件配置随机值或默认值,并赋值给实体类属性
① 创建一个实体类Person
package com.lzk.pojo;
@Component //注册bean到容器中,实现被Spring被扫描到
@Getter
@Setter
@ToString
/**
* @ConfigurationProperties(prefix = "person")
* --->(prefix = "person")是配置文件中的层级名称而不是配置文件名称。
* -->表示通过ConfigurationProperties将里面的person参数
* -->与.yaml里面的person下面的参数配置绑定起来,
* -->绑定起来这个实体类Person就有注入的值了
*/
@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;
}
② .yaml配置文件设置属性的随机值,或者若属性为空设置其默认值
person:
# 随机生成一个UUID值
name: linzk123${random.uuid}
# 随机生成一个int类型的值
age: ${random.int}
birth: 2020/11/14
maps: {k1: v1, k2: v2}
hello: happy
lists:
- code
- music
- girl
dog:
----------------------------------------下面引用段说明↓:
name: ${person.hello: hello}_旺财
age: 3
# 上面'name'中的意思为:如果person下面存在hello这个属性,
则name值取:happy_旺财。
# 如果person下面不存在hello这个属性 ,则name的值为:hello_旺财
# 这就是占位符的使用
------------------------------------------------------
③ 测试
/**
* 使用以下测试类来测试
*/
@SpringBootTest
public class SpringbootApplicationTests {
@Autowired
private Person person;
@Test
public void test1() {
System.out.println(person);
}
}
↑ 运行以上程序,结果如-"图y1"
Person{name = linzk2315161651sad-165a1s65d165asd-1as65d16sad15sa6 ...其他字段值忽略}
1.5 @Value和@ConfigurationProperties注解区别
1. @Value和@ConfigurationProperties,如-"图vc"
⑴、@ConfigurationProperties只需要写一次即可 , @Value则
需要每个字段都添加@Value注解。
2. @Value和@ConfigurationProperties使用结论:
⑴ 配置yml和配置properties都可以获取到值,强烈推荐 yml;
⑵ 如果我们在某个业务中,只需要获取配置文件中的某个值,
可以使用一下@value;
⑶ 如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,
就直接@configurationProperties,不要犹豫!
图vc
2. 松散绑定与JSR303数据校验
1. 松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的,
后面跟着的字母默认是大写的。这就是松散绑定。
2. JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证,可以保证数据的合法性。
3. 复杂类型封装,yml中可以封装对象,使用value就不支持。
2.1 松散绑定使用案例
1. 松散绑定代码演示
⑴ Dog实体类
@Component
@ConfigurationProperties(prefix = "dog")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Dog {
private String firstName;
private Integer age;
}
⑵ 配置文件.yaml
dog:
first-name: 阿黄
age: 3
⑶ 测试
@SpringBootTest
public class SpringbootApplicationTests {
@Autowired
private Dog dog;
@Test
public void contextLoads() {
System.out.println(dog);
}
}
↑运行以上程序,输出结果,如-"图p4"
⑷ 松散绑定规则:
- 实体类属性字段使用"驼峰命名"。
- .yaml配置文件的属性字段名字中间使用"-"来命名。
图p4
2.2 JSR303数据校验及常见校验参数
1. 使用@Validated实现数据校验
- Springboot中可以用@validated来校验数据,
如果数据异常则会统一抛出异常,方便异常中心统一处理。
我们这里来写个注解让我们的name只能支持Email格式。
⑴ 实体类Person
@Component //注册bean
@ConfigurationProperties(prefix = "person")
@Validated //数据校验
public class Person {
@Email(message="邮箱格式错误") //name必须是邮箱格式
private String name;
}
⑵ .yaml配合文件设置person的值
person:
name: linzk123
age: 13
birth: 2020/11/14
maps: {k1: v1, k2: v2}
lists:
- code
- music
- girl
dog:
name: 旺财
age: 3
⑶ 测试
@SpringBootTest
public class SpringbootApplicationTests {
@Autowired
private Person person;
@Test
public void contextLoads() {
System.out.println(person);
}
}
↑ 运行上面测试类,报错name不是一个合法邮箱。
---------------------------------------------------
2. 常见的校验参数
@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;
---------------------------------------------------
3. 几种用于校验的注解
⑴ 空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
⑵ 长度检查
@Size(min=, max=)
-->验证对象(Array,Collection,Map,String)长度是否在给定的范
围内
@Length(min=, max=) string is between min and max included.
⑶ 日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
⑷ 其余更多自行查找官方文档资料..
3. 多环境配置及配置文件位置
3.1 配置文件的存放位置优先级
1. "项目下"和"资源下"的配置文件位置说明,如-"图ap1"
2. 配置文件加载位置顺序,优先级:
⑴ springboot 启动会扫描以下位置的application.properties或者
application.yml文件,作为Spring boot的默认配置文件:
优先级1:项目路径下的config文件夹配置文件
优先级2:项目路径下配置文件
优先级3:资源路径下的config文件夹配置文件
优先级4:资源路径下配置文件
--->以上↑程序读取配置文件的优先级,从上到下,由高到底,
--->高优先级的配置会覆盖低优先级的配置。
图ap1
3.2 多环境下多个配置文件的切换
3.2.1 多环境切换(.properties配置文件)
1. 配置文件指定规则
⑴ 我们在主配置文件编写的时候,文件名可以是:
--> application-{profile}.properties/yml.
--> 用来指定多个环境版本.
2. 多个配置文件创建举例:
⑴ 例如:
application-test.properties 代表测试环境配置
application-dev.properties 代表开发环境配置
application.properties 默认的配置文件
⑵ 但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;
我们需要通过这个application.properties默认的配置文件来选择指定需要激活/切换的环境:
- 比如在三个配置文件中,都指定了不同的端口号,他默认会使用application.properties的端口号。
- 比如在默认的配置文件中要指定使用dev环境,我们就需要在默认的application.properties配置文件中
输入:pring.profiles.active=dev
- 我们启动SpringBoot,就可以看到已经切换到dev下的配置了;
3.2.2 多环境切换(.yml配置文件)
1. 如果想使用.yml也创建多个配置文件,以此来切换环境。使用.yml更方便
- 首先如果有一个主配置文件和两个副配置文件。
- 我们只需要在主配置文件中,以"---"隔开,就可以在一个文件中配置多个配置文件。
2. 案例演示
- 和properties配置文件中一样,但是使用yml去实现不需要创建多个配置文件!
- 即.yml在一个配置文件中就可以实现三个配置文件的创建。
server:
port: 8081
#选择要激活那个环境块
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev #配置环境的名称
---
server:
port: 8084
spring:
profiles: prod #配置环境的名称
↑上面是在同一个.yml配置文件输入了三个配置文件的内容,
我们在.yml配置文件中以"---"隔开,就能在一个配置文件中创建多个.yml的配置文件。
-->即:一个.yml文件就完成需创建多个.properties配置文件才可完成的事。
3.3 .yml和.properties配置文件同时使用情况
1. 注意:如果yml和properties同时都配置了端口,
并且没有激活其他环境 , 默认会使用properties配置文件的!