YAML语法使用 & JSR303数据校验
1.YAML
YAML是 "YAML Ain't a Markup Language" (YAML不是一种置标语言)的递归缩写
# yaml配置 server: prot: 8080
YAML语法
# 基本语法(空格不能省略)
# 以空格的缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的
# 属性和值的大小写都是十分敏感的
k:(空格) v
# 例子
server:
port: 8081
path: /hello
字面量:普通的值 [ 数字,布尔值,字符串 ]
# 字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;
# “” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;比如 :name: "zhang \n san" ,输出 : zhang 换行 san
# '' 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出 比如 : name: ‘zhang \n san’ 输出 : zhang \n san
k: v
对象、Map(键值对)
k: v1: v2: --- # 实例 student: name: zhangsan age: 20 # 行内写法 student: {name: zhangsan,age: 20}
数组( List、set )
k: - v1 - v2 - v3 --- # 实例 pets: - cat - dog - pig # 行内写法 pets: [cat,dog,pig]
程序实现
导入配置文件处理器,配置文件进行绑定就会有提醒
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
示例
# YAML配置 person: name: 张三 age: 20 happy: true birth: 2019/01/01 maps: {k1: v1,k2: v2} lists: - code - girl - music dog: name: 温馨的小家 num: 5 -------------------------------------------------- /* @ConfigurationProperties作用: 将配置文件中配置的每一个属性的值,映射到这个组件中; 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定 参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应; 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能 */ @Component //注册bean @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 Home home; //get,set,toString省略 }
两种注入值方式对比@configurationProperties与@value
总结
- 配置yml和配置properties都可以获取到值 , 强烈推荐 yml
- 如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value
- 如果说专门编写了一个JavaBean来和配置文件进行映射,就直接使用@configurationProperties
YAML的多环境切换
yml实现不需要创建多个配置文件,一个配置文件用“---”分割即可,表示多个yml多文档块
# 示例 server: port: 8080 #选择要激活那个环境块 spring: profiles: active: prod --- server: port: 8081 #配置环境的名称 spring: profiles: dev --- server: port: 8082 #配置环境的名称 spring: profiles: prod
注意:如果yml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的。
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
优先级由高到底,高优先级的配置会覆盖低优先级的配置
2.JSR303数据校验
spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
// 示例 @Component //注册bean @ConfigurationProperties(prefix = "person") @Validated //数据校验 public class Person { @Email //name必须是邮箱格式 private String email; }
@PropertySource :加载指定的配置文件;使用@configurationProperties默认从全局配置文件中获取值
// @PropertySource注解加载person.properties配置文件,做关联 @PropertySource(value = "classpath:person.properties") @Component //注册bean public class Person { @Value("${name}") private String name; ...... }