SpringBoot-Profile
Profile(多环境配置)
在实际开发中,一个项目通常会存在多种环境。Profile在不同环境下使用不同的配置提供了支持,可以通过激活,指定参数来快速切换环境。
多Profile文件方式
当我们项目中有多个环境时,我们要对不同的环境进行区分
区分格式:
application-{profile}.properties/yaml
profile用来指定不同的环境,通常使用简称,例如dev、test、和prod等等。
properties配置
在resources目录下添加4个配置环境
- application.properties 主配置文件
- application-dev.properties:开发环境配置文件
- application-test.properties:测试环境配置文件
- application-prod.properties:生产环境配置文件
application.properties
#默认端口号
sever.port=8080
#激活指定的profile
spring.profiles.active=prod
application-dev.properties
#端口号
server.port=8081
application-prod.properties
#端口号
server.port=8082
application-test.properties
#端口号
server.port=8083
测试
发现我们设置的相应环境生效,yaml配置类似
多Profile文档块模式
在 YAML 配置文件中,可以使用“—”把配置文件分割成了多个文档块,因此我们可以在不同的文档块中针对不同的环境进行不同的配置,并在第一个文档块内对配置进行切换。
application.yml
#默认配置
server:
port: 8080
#切换配置
spring:
profiles:
active: test
---
#开发环境
server:
port: 8081
spring:
config:
activate:
on-profile: dev
---
#测试环境
server:
port: 8082
spring:
config:
activate:
on-profile: test
---
#生产环境
server:
port: 8083
spring:
config:
activate:
on-profile: prod
注意:如果yml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的!
激活Profile
有三种方式
- 配置文件(上面既是)
- 命令行激活
- 虚拟机激活
- 命令行激活
将SpringBoot项目打包成jar文件,执行mvn命令
mvn clean package
项目打包完后配置命令行参数,激活指定Profile
java -jar helloworld-0.0.1-SNAPSHOT.jar
--spring.profiles.active=dev
- 虚拟机激活
同样需要项目打包,配置命令行参数不同
java -Dspring.profiles.active=prod -jar
helloworld-0.0.1-SNAPSHOT.jar
SpringBoot默认配置文件
配置文件加载位置
外部加载资源配置的文件的方式有狠毒偶,我们选择开发中最常用资源文件进行配置。
官方外部配置文件说明参考文档
springboot启动会扫描以下位置的application.properties或者application.yaml文件作为Spring boot的默认配置文件:
优先级1:项目路径下的config文件夹配置文件
优先级2:项目路径下配置文件
优先级3:资源路径下的config文件夹配置文件
优先级4:资源路径下配置文件
优先级由高到底,高优先级的配置会覆盖低优先级的配置
- 存在相同的配置内容时,高优先级的内容会覆盖低优先级的内容;
- 存在不同的配置内容时,高优先级和低优先级的配置内容互补配置。
这里可参考别的文章
[(http://c.biancheng.net/spring_boot/default-config.html)]
SpringBoot外部配置文件
除了外部配置文件外,SpringBoot还可以加载一些位于项目外部的配置文件。
指定外部配置文件的路径
- spring.config.location
- spring.config.additional-location
spring.config.location
可以先将 Spring Boot 项目打包成 JAR 文件,然后在命令行启动命令中,使用命令行参数 --spring.config.location,指定外部配置文件的路径。
java -jar {JAR} --spring.config.location={外部配置文件全路径}
- 在本地目录下D:\myConfig下,创建一个配置文件my-application.yaml 配置如下
#指定配置文件
server:
port: 8088
-
执行以下 mvn 命令,将 springbootdemo 项目打包成 JAR。
mvn clean package
-
打开命令行窗口,跳转到 JAR 文件所在目录,执行以下命令,其中 --spring.config.location 用于指定配置文件的新位置。
java -jar springbootdemo-0.0.1-SNAPSHOT.jar --spring.config.location=D:\myConfig\my-application.yml
spring.config.additional.location
其他步骤和spring.config.locaition一致,命令行窗口命令不同
java -jar springbootdemo-0.0.1-SNAPSHOT.jar -- spring.config.additional-location=D:\myConfig\my-application.yml
注意:Maven 对项目进行打包时,位于项目根目录下的配置文件是无法被打包进项目的 JAR 包的,因此位于根目录下的默认配置文件无法在 JAR 中生效,即该项目将只加载指定的外部配置文件和项目类路径(classpath)下的默认配置文件
- spring.config.location 使项目默认的配置文件失效
- spring.config.additional-location不会使项目默认的配置文件失效,使用该命令行参数添加的外部配置文件会与项目默认的配置文件共同生效,形成互补配置,且其优先级是最高的,比所有默认配置文件的优先级都高
通过上面的示例,我们看到将 Spring Boot 项目打包后,然后在命令行启动命令中添加 spring.config.additional-location 参数指定外部配置文件,会导致项目根目录下的配置文件无法被加载,我们可以通过以下 3 种方式解决这个问题。
在 IDEA 的运行配置(Run/Debug Configuration)中,添加虚拟机参数 -Dspring.config.additional-location=D:\myConfig\my-application.yml,指定外部配置文件;
在 IDEA 的运行配置(Run/Debug Configuration)中,添加程序运行参数 --spring.config.additional-location=D:\myConfig\my-application.yml,指定外部配置文件;
在主启动类中调用 System.setProperty()方法添加系统属性 spring.config.additional-location,指定外部配置文件。
JSR303数据校验
数据校验
JSR是Java Specification Requests的缩写,意思是Java 规范提案,数据
校验就是对字段进行过滤验证,来保证数据的合法性,通常使用在yaml配置中的字
段。
如何使用
SpringBoot可以用@validated来校验数据,果数据异常则会统一抛出异常,方便异常中心统一处理。
导入依赖:
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.16.Final</version>
</dependency>
代码展示:
@Component //注册Bean到容器中
@ConfigurationProperties(prefix="person")
@Validated //数据校验
public class Person {
@Email(message = "邮件格式不正确")
private String name;
private Integer age;
private Date date;
private Boolean isStudent; //属性的名称正规一点
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
测试:
常见参数
@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 对象是否符合正则表达式的规则
.......等等
除此以外,我们还可以自定义一些数据校验规则