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; }
结果如下:
各种检查如下: