2.配置文件及用法
yml语法格式
# yml语法格式:
# key:空格value(代表配置的键值对关系)
# 使用缩进达到跟properties的 . 的功能(层级关系)
# 左对齐同一列数据(相同缩进),代表同一个层级关系
value的一般写法、高级写法
# value的一般写法
# 字符串默认是不需要加双引号(或者单引号)的
# 双引号:不会转义字符串中的特殊字符(特殊字符就表示其本身标识的含义,/n就是换行)
# 单引号:会转义字符串中的特殊字符(特殊字符最终标识就是其本身的字符串,不然/n输出就是/n字符串)
user:
userName: tom
userAge: 20
# value的高级写法
# 用户信息
user:{userName:tom,userAge: 20}
users:
- mark
- marry
- zuck
users: [ mary,marry,zuck ]
自定义配置
# 自定义配置信息
user:
userId: U0001
user_name: Root
userAge: 20
adult: true
birth_day: 2000/07/16 14:14:14
left_money: 6666.6
nick_name: yyds
role:
roleId: R101
roleName: admin
userEmail: 123@123.com
yml与beans映射
分为批量映射和单个映射
批量映射关键字:@ConfigurationProperties(prefix = "user"),需要配置@Conponent一起使用,配置前缀
单个映射关键字:@Value
指定映射:@PropertySource(value = "classpath:user.properties")
package com.lcywings.sbt.springbiit02configlcywings.beans;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* Created on 2021/7/16.
* <p>
* Author : Lcywings
* <p>
* Description : 读取系统配置文件中自定义配置主要方式,两种
* 方式1:批量自动读取,使用注解:@ConfigurationProperties
* 注意:
* 1.此注解不能单独使用,必须配置@Conponent使用(自动读取必须是容器中的组件)
* 2.必须指定要读取的配置的前缀标识(prefix="xxx.xxx")
* 优点:支持松散绑定-比如驼峰映射(识别 _ 或者 - )
* 支持复杂类型封装-比如实体map,list等
* 支持数据校验-比如实体增加@Email注解,必须读取的配置信息为邮件地址
*
* 方式2:单个属性读取,使用注解:@Value
* 注意:
* 此注解是能写在实体属性上,不支持松散绑定语法(必须跟配置一致),不支持复杂类型封装
* 读取配置由两种写法:${}和#{}
* ${xxx.xx}:用于读取配置文件中的自定义配置,还可以设置默认值
* #{xxx.xx}:用于读取容器中的已有的实体的属性值,还可以设置固定值
*
* 方式三 扩展写法,防止有些自定义配置写在单独配置文件中
* 一般不用
* @PropertySource(value = "classpath:user.properties")
*/
@Data
@Component
@ConfigurationProperties(prefix = "user")
public class User {
/**
* 用户编号
*/
//@Value("${user.userId}")
private String userId;
/**
* 用户id
*/
//@Value("${user.user_name}")
private String userName;
/**
* 用户名
*/
//@Value("${user.userAge:18}")
private Integer userAge;
/**
* 是否成年
*/
//@Value("${user.adult}")
private Boolean adult;
/**
* 用户生日
*/
//@Value("${user.birth_day}")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date birthDay;
/**
* 账户余额
*/
// @Value("#{8888.8}")
private Double leftMoney;
/**
* 用户昵称
*/
// @Value("#{user.userName}")
private String nick_name;
/**
* 角色
*/
// @Value("${role}")
private Role role;
}
@Validated格式校验
限制 | 说明 |
---|---|
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
@NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty ,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |
@AssertFalse | 限制必须为false |
AssertTrue | 限制必须为true |
Size(max,min) | 限制字符长度必须在min到max之间 |
@Future | 验证日期为当前时间之后 |
FutureOrPresent | 验证日期为当前时间或之后 |
@Past | 限制日期为当前时间之前(高版本 2.1.6(支持date,也支持localDate,@past校验过去时间))(低版本1.5.9 (支持date,不支持localDate,@past校验过去时间)) |
@PastOrPresent | 限制日期为当前时间或之前 |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
@Negative | 限制必须为负整数 |
@NegativeOrZero | 限制必须为负整数或零 |
@Positive | 限制必须为正整数 |
@PositiveOrZero | 限制必须为正整数或零 |
Pattern(value) | 限制必须符合指定的正则表达式 |
限制必须为email格式 |
这玩意校验不对会报错,会报MethodArgumentNotValidException这个错
根目录
根目录@PropertySource(value = "classpath:user.properties")
自定义配置beans
/**
* @author : Lcywings
* @date : 2021/7/16 16:10
* @acl : true
* @description : 添加一个角色对象到容器中
*
*/
@Bean
public Role role() {
Role role = new Role();
role.setRoleId("R102");
role.setRoleName("开发");
role.setUserEmail("234@234.com");
return role;
}
配置优先顺序
配置文件加载的位置:springboot启动默认扫描配置文件位置顺序:
下面四个位置中的application.properties或者application.yml
- 项目根路径下config目录中的配置
- 项目跟路径下的配置文件
- 项目resources目录下的config目录中的配置文件
- 项目resources目录下的配置文件
四个配置文件:互补配置-不是只有优先级高的配置文件生效,而是优先级高的配置文件会自动覆盖低优先级的配置文件。如果配置在其他配置文件中不存在,也可以生效。
@Conditional
spring.factories文件里每一个xxxAutoConfiguration文件一般都会有下面的条件注解:
- @ConditionalOnBean:当容器里有指定Bean的条件下
- @ConditionalOnClass:当类路径下有指定类的条件下
- @ConditionalOnExpression:基于SpEL表达式作为判断条件
- @ConditionalOnJava:基于JV版本作为判断条件
- @ConditionalOnJndi:在JNDI存在的条件下差在指定的位置
- @ConditionalOnMissingBean:当容器里没有指定Bean的情况下
- @ConditionalOnMissingClass:当类路径下没有指定类的条件下
- @ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
- @ConditionalOnProperty:指定的属性是否有指定的值
- @ConditionalOnResource:类路径是否有指定的值
- @ConditionalOnSingleCandidate:当指定Bean在容器中只有一个,或者虽然有多个但是指定首选Bean
- @ConditionalOnWebApplication:当前项目是Web项目的条件下。
上面@ConditionalOnXXX都是组合@Conditional元注解,使用了不同的条件Condition。@ConditionalOnWebApplication注解:@Conditional(OnWebApplicationCondition.class)
Q.E.D.