springboot在底层已经自动配置了很多东西,但有些东西我们是不需要或者需要改的,比如数据源
springboot提供一个全局的配置文件,供我们修改他的默认值
这个全局文件名称固定,但可以使用两种格式:application.yaml,application.properties
两种格式的语法:
-
application.properties
-
语法结构 :key=value
-
application.yml
-
语法结构 :key:空格 value
官网强烈推荐yaml格式
何为yaml?
yaml是以数据作为中心的,一种记录数据的标记语言
yaml的基础语法:声明:语法要求严格!
- 空格不能省略
- 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
- 属性和值的大小写都是十分敏感的。
1,基本数据类型及string K: V形式
value的值可以直接写, 字符串默认不用加上双引号或者单引号;
name: 黄易安 age: 27
注意:
-
“ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;
比如 :name: "kuang \n shen" 输出 :kuang 换行 shen
-
'' 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出
比如 :name: ‘kuang \n shen’ 输出 :kuang \n shen
2,map类型的
maps: {k1: v1,k2: v2} #或者 maps: k1: v1 k2: v2
3,数组类型的
list: - code - music - girl #或者 list:[code,music,girl]
4,对象类型,类名及其属性
dog: name: 旺财 age: 3
yaml文件可以直接向实体类注入值:使用注解@ConfigurationProperties ,后面跟的"people"即下面的yaml文件的k值
对应实体类创建:
@Component @Data @ConfigurationProperties("people") public class people { private String name; private Integer age; private Dog dog; private boolean happy; private Date birth; private Map<Object,Object> maps; private List<Object> list; }
对应yaml:
people: name: 黄易安 age: 27 dog: name: 旺财 age: 3 happy: true birth: 2021/09/07 maps: {k1: v1,k2: v2} list: - code - music - girl
当使用properties时,也可以导入值,但比较麻烦,方法如下:
使用注解:@PropertySource(value = "classpath:person.properties") 导入对应配置文件
在通过spring表达式,${}获取对应配置文件里的值
@PropertySource(value = "classpath:person.properties") @Component public class Person { @Value("${name}") private String name; ...... }
这种方法需要一个一个匹配,不能像yaml一样,全部匹配~
yaml可以使用spring表达式,如下,当然了@value也可以使用
person: name: qinjiang${random.uuid} # 随机uuid age: ${random.int} # 随机int happy: false birth: 2000/01/01 maps: {k1: v1,k2: v2} lists: - code - girl - music dog: name: ${person.hello:other}_旺财 age: 1
两者对比:
1,configurationproperties可以自己匹配,但当K值和pojo类的属性不一致时,pojo的类属性值会为null
2,松散绑定,驼峰转换,pojo类里 userName,yaml里 user-name ,会自动转换,匹配成功
3,spel,即${}
4, 303校验,可以在类上使用@Validated开启校验,并通过对应例如,邮箱格式检查@Email在属性注解,进行校验,如下:
@Component @Validated @ConfigurationProperties("people") public class people { @Email private String name; private Integer age; private Dog dog; private boolean happy; private Date birth; private Map<Object,Object> maps; private List<Object> list; }
结果如下:
各种检查的注解如下:
@NotNull(message="名字不能为空") private String userName; @Max(value=120,message="年龄最大不能查过120") private int age; @Email(message="邮箱格式错误") private String email; 空检查 @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 对象是否符合正则表达式的规则 .......等等 除此以外,我们还可以自定义一些数据校验规则