SpringBoot-配置文件
目录
配置文件
语法结构
基本语法
多个properties配置文件
激活指定配置文件
在配置文件中指定 spring.profiles.active=dev
yml支持多文档块方式
运行测试
配置文件加载位置
获取配置文件中的数据
使用@Value注解
使用@ConfigurationProperties注解
@Value获取值和@ConfigurationProperties获取值比较
松散绑定
SpEL
JSR303数据校验
依赖导入
Bean Validation 规范内嵌的约束注解
配置文件
SpringBoot使用一个全局的配置文件,配置文件名是固定的(
application.properties
或application.yml
)。
配置文件的作用:修改SpringBoot自动配置的默认值,SpringBoot在底层都给我们自动配置好了。
语法结构
application.properties
语法结构 :key=value
server.port=8081
application.yml(推荐)
基本语法
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- 大小写敏感
- 语法结构 :key:空格 value (空格不能省略)
server:
port: 8081
application.yml 设置数据
YAML 支持的三种数据结构:
- 字面量:单个的、不可再分的值
- 对象:键值对的集合
- 数组:一组按次序排列的值
server:port: 8081#普通key-value
name: 埼玉#对象
student:name: QiYuage: 3#对象行内写法
student: {name: QiYu,age: 3}#数组
pets:- cat- dog- pig#数组行内写法
pets1: [cat,dog,pig]
yaml可以直接给实体类赋值
person:name: 埼玉age: 3happy: truebirth: 2020/7/27maps: {k1: Flash,k2: King}lists:- code- musicdog:name: 波奇age: 3
多个properties配置文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml
默认使用application.properties的配置
激活指定配置文件
在配置文件中指定 spring.profiles.active=dev
application.properties:
server.port=8081
spring.profiles.active=dev
yml支持多文档块方式
spring:profiles:active: dev #指定属于哪个环境
---
server:port: 8083
spring:config:activate:on-profile: dev
---
server:port: 8084
spring:profiles: prod #不推荐的写法
运行测试
配置文件加载位置
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
- classpath:/config/
- classpath:/
获取配置文件中的数据
使用@Value注解
在application.yaml中添加数据
dog:name: 波奇age: 3
将数据映射到Dog实体类中
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class Dog {@Value("${dog.name}")private String name;@Value("${dog.age}")private String age;
}
注意:导入@Value注解的包为:import org.springframework.beans.factory.annotation.Value;如果@Value提示错误很可能是导包错误。
运行测试,已将配置文件中的数据设置到实体类中
使用 @Value 注解有两点注意事项:
- 对象要交给 Spring 容器管理,也就是需要在类上加 @Component 等注解;
- 在静态变量上直接添加 @Value 注解是无效的。若要给静态变量赋值,可以在 set() 方法上加 @Value 注解。
使用@ConfigurationProperties注解
在application.yaml中添加数据
person:name: 埼玉age: 3happy: truebirth: 2020/7/27maps: {k1: Flash,k2: King}last-name: 光头披风侠lists:- code- musicdog:name: 波奇age: 3
使用注解将配置文件中的数据注入到实体类中(实体对象需要为Bean)
@ConfigurationProperties
编写Java实体类
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {private String name;private String age;private Boolean happy;private Date birth;private Map<String,Object> maps;private List<String> lists;private Dog dog;
}
运行测试,数据导入成功
注意:注解的实体对象的属性名要和配置文件中的属性名相同,否则不能设置成功
@Value获取值和@ConfigurationProperties获取值比较
项目 | @ConfigurationProperties | @Value |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
注意:
- 配置文件yml还是properties他们都能获取到值
- 只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
- 使用javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
松散绑定
yaml中写的last-name,这个和lastName是一样的“-”后面跟着的字母默认是大写的。这就是松散绑定。
在Person中加入lastName字段
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {private String name;private String age;private Boolean happy;private Date birth;private Map<String,Object> maps;private String lastName;private List<String> lists;private Dog dog;
}
在yaml文件中加入last-name: 光头披风侠字段
person:name: 埼玉age: 3happy: truebirth: 2020/7/27maps: {k1: Flash,k2: King}last-name: 光头披风侠lists:- code- musicdog:name: 波奇age: 3
测试成功
SpEL
详细使用参考:Spring-SpEL表达式超级详细使用全解-CSDN博客
JSR303数据校验
- JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation。
- Bean Validation 是一个运行时的数据验证框架,用于校验数据合规性。
依赖导入
<!--引入validation的场景启动器-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Bean Validation 规范内嵌的约束注解
限制 | 说明 |
---|---|
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@AssertFalse | 限制必须为false |
@AssertTrue | 限制必须为true |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
@Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
@Future | 限制必须是一个将来的日期 |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@Past | 限制必须是一个过去的日期 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Size(max,min) | 限制字符长度必须在min到max之间 |
@Past | 验证注解的元素值(日期类型)比当前时间早 |
@NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
@NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |
给对象添加校验注解
public class QiYu {private Integer id;@NotBlank(message = "名称不能为空")private String name;private Date data;@NotNull(message = "年龄不能为空")private Integer age;@Pattern(regexp = "[0-9]" , message = "参数格式错误")private String Telephone;
}
Controller 中需要校验的参数Bean前添加 @Validated开启校验功能,紧跟在校验的Bean后添加一个BindingResult,BindingResult封装了前面Bean的校验结果。
@GetMapping("/validation")public String into(@Validated QiYu qiyu , BindingResult bindingResult) {if(bindingResult.hasErrors()){Map<String,String> map = new HashMap<>();bindingResult.getFieldErrors().forEach((item) ->{String msg = item.getDefaultMessage();String fie = item.getField();map.put(fie,msg);});return map.toString();}return "200";}
运行测试,由于QiYu对象属性未赋值所以会提示错误信息。
至此鸣谢:SpringBoot的配置【配置文件、加载顺序、配置原理】(超详细)_springboot component 和service那个先启动-CSDN博客Spring Boot 使用 JSR303(@Validated) 实现参数校验_validator对应springboot3版本-CSDN博客