继springboot 学习(一) 接下来将如何修改springboot配置文件,这个文件配置可以修改各个类的属性值,前提是这个类有这个注解@ConfigurationProperties
这个配置文件名称固定,但可以使用两种格式:application.yaml,application.properties
配置文件所在可以在如下几个位置:来自官方的图
1 表示的是项目路径下得config目录
2 项目路径
3 表示资源文件下的config目录
4 表示资源目录下
可以在以上各个路径下都配置application.properties文件,但是有优先级,优先级分别是1>2>3>4
拓展,运维小技巧
指定位置加载配置文件
我们还可以通过spring.config.location来改变默认的配置文件位置
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;这种情况,一般是后期运维做的多,相同配置,外部指定的配置文件优先级最高
java -jar spring-boot-config.jar --spring.config.location=F:/application.properties
yaml文件的使用:
两种格式的语法:
-
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 =
@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 对象是否符合正则表达式的规则
.......等等
除此以外,我们还可以自定义一些数据校验规则
配置多套环境:
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本,如下
配置两套环境,分别是dev测试,prod生产
如何使用呢,如下:
---这是分割线,表示在同一个yanl中,可以进行多个配置,
server: port: 8081 #选择要激活那个环境块 spring: profiles: active: prod --- server: port: 8083 spring: profiles: dev #配置环境的名称 --- server: port: 8084 spring: profiles: prod #配置环境的名称