一、yml基本语法与表达
1、yaml基本语法
1、k:(空格)v 表示键值对
key: value
2、利用缩进表示层级关系
key:
child-key1: value1
child-key2: value2
3、属性和值大小写敏感
4、注释
使用#进行注释
#xxxxxxx
key: value
2、值的表达
1、对象
Student:
name: tom
age: 11
#行内写法
Student: {
name:tom,age:11}
2、数组
nums:
- 1
- 2
- 3
#行内写法
nums: {
1,2,3}
二、springboot配置文件
在写之前可以先导入配置文件处理器,这样在编写yml时就会有提示了
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
1、配置文件值的注入
前提:必须将该配置文件所对应的javabean放在IOC容器中,即使用@Component注解
方式1
使用@ConfigurationProperties(prefix = “person”)设一个用于绑定的值,在配置文件中通过这个绑定值,来设置该类其中的属性。
javabean
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private boolean boss;
private Date date;
private Map<String,Object> maps;
private List<Object> list;
private Dog dog;
....
}
@Component
public class Dog {
private String name;
private Integer age;
...
}
yml配置文件
person:
lastname: zhangsan
age: 11
boss: true
date: 2010/11/11
maps: {
k1: v1,k2: v2}
list:
- list1
- list2
- list3
dog:
name: xiaoming
age: 2
结果:
Person{lastName='zhangsan', age=11, boss=true, date=Thu Nov 11 00:00:00 CST 2010, maps={k1=v1, k2=v2, kw=v2}, list=[list1, list2, list3], dog=Dog{name='xiaoming', age=2}}
方式二
可以通过使用@PropertySource指定properties配置文件将其中的值赋给该对象
配置文件
person.last-name=张三
person.age=11
person.boss=false
person.date=2021/2/2
person.maps.k1=v1
person.maps.kw=v2
person.list=a,x,c,v
person.dog.name = dog
person.dog.age = 15
javabean
/**
* 将配置文件中的每一个属性的值映射到这个组件中
* @ConfigurationProperties 高数springboot将本类中所有属性和配置文件中相关的配置进行绑定
* prefix 在配置文件中哪个下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能提供@ConfigurationProperties的功能
*
* @PropertySource 导入spring的配置文件,让配置文件中的内容生效
*/
@PropertySource(value = {
"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private boolean boss;
private Date date;
private Map<String,Object> maps;
private List<Object> list;
private Dog dog;
...
}
结果
Person{lastName='张三', age=11, boss=false, date=Tue Feb 02 00:00:00 CST 2021, maps={k1=v1, kw=v2}, list=[a, x, c, v], dog=Dog{name='dog', age=15}}
方式三
使用@Value注解为属性赋值
@Component
//@ConfigurationProperties(prefix = "person")
public class Person {
@Value("zhangsan")
private String lastName;
@Value("11")
private Integer age;
private boolean boss;
private Date date;
private Map<String,Object> maps;
private List<Object> list;
private Dog dog;
结果
Person{lastName='zhangsan', age=11, boss=false, date=null, maps=null, list=null, dog=null}
2、@Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
3、配置文件注入数据校验
在使用校验之前需要先导入字段校验的依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
先用@Validated注解修饰要校验的类,然后用一下的注解修饰该类中要校验的属性
@AssertFalse 校验false
@AssertTrue 校验true
@Email 校验是否是邮箱格式
@DecimalMax(value=,inclusive=) 小于等于value,
inclusive=true,是小于等于
@DecimalMin(value=,inclusive=) 与上类似
@Max(value=) 小于等于value
@Min(value=) 大于等于value
@NotNull 检查Null
@Past 检查日期
@Pattern(regex=,flag=) 正则
@Size(min=, max=) 字符串,集合,map限制大小
@Validate 对po实体类进行校验
使用方式三的配置文件注入
@PropertySource(value = {
"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
// @Value("zhangsan")
@Email
private String lastName;
// @Value("11")
private Integer age;
private boolean boss;
private Date date;
private Map<String,Object> maps;
private List<Object> list;
private Dog dog;
...
}
结果:
java.lang.IllegalStateException: Failed to load ApplicationContext
4、配置文件占位符
#配置person的值
#配置文件的占位符${},如果想设没有的默认值可以用${name:defualt}
#通过使用${random.xxxx}随机数 例${random.value}、${random.int}、${random.long}、${random.int(10)}、${random.int[1024,65536]}等等
person.last-name=张三${random.int}
person.age=11
person.boss=false
person.date=2021/2/2
person.maps.k1=v1
person.maps.kw=v2
person.list=a,x,c,v
person.dog.name = ${person.hello:hello}dog
person.dog.age = 15
结果
//结果1
Person{lastName='张三-1155973093', age=11, boss=false, date=Tue Feb 02 00:00:00 CST 2021, maps={k1=v1, kw=v2}, list=[a, x, c, v], dog=Dog{name='hellodog', age=15}}
//结果2
Person{lastName='张三1191295749', age=11, boss=false, date=Tue Feb 02 00:00:00 CST 2021, maps={k1=v1, kw=v2}, list=[a, x, c, v], dog=Dog{name='hellodog', age=15}}
5、多Profile文件
1、多Profile文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml
默认使用application.properties的配置;
application.properties文件
#激活使用application-dev.properties配置文件
spring.profiles.active=dev
application-dev.properties文件
#使用application-{profile},properties/yml取配置文件名
#默认使用的是application.properties
server.port=8081
application-prod.properties文件
server.port=8082
结果
2、yml支持多文档块方式
#yml支持多文档块方式用 --- 来分割文档块
server:
port: 8080
spring:
profiles:
active: prod
---
server:
port: 8081
spring:
profiles: dev #制定属于那个环境
---
server:
port: 8082
spring:
profiles: prod
---
结果
6、配置文件加载位置
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
file:./config/
file:./
classpath:/config/
classpath:/
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
还可以通过spring.config.location来改变默认的配置文件位置
7、外部配置加载顺序
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
1.命令行参数
所有的配置都可以在命令行上进行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
多个配置用空格分开; --配置项=值
2.来自java:comp/env的JNDI属性
3.Java系统属性(System.getProperties())
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
由jar包外向jar包内进行寻找;
优先加载带profile
6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
再来加载不带profile
8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10.@Configuration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性
所有支持的配置加载来源;