yaml 文件的使用
springboot配置文件可以使用application.properties
也可以使用application.yaml
和application.yml
1、语法规则
server:
port: 8081
address: xxx
对比properties
server.port=8082
server.address=xxx
-
代码量减少 可读性强
-
属性值和属性名之间要存在一个空格
-
功能对比
2、属性值的注入
我们在application
配置文件中输入类似 server.port=8082
springboot 是如何配置到对用的配置类中的?
- 我们编写的配置文件一定和配置类有关联性
我们打开我们的随意一个配置类 我们以 JackSonPropertise.classc
-
查看它的属性列表
-
private String dateFormat; private String propertyNamingStrategy; private final Map<PropertyAccessor, Visibility> visibility = new EnumMap(PropertyAccessor.class); private final Map<SerializationFeature, Boolean> serialization = new EnumMap(SerializationFeature.class); private final Map<DeserializationFeature, Boolean> deserialization = new EnumMap(DeserializationFeature.class); private final Map<MapperFeature, Boolean> mapper = new EnumMap(MapperFeature.class); private final Map<Feature, Boolean> parser = new EnumMap(Feature.class); private final Map<com.fasterxml.jackson.core.JsonGenerator.Feature, Boolean> generator = new EnumMap(com.fasterxml.jackson.core.JsonGenerator.Feature.class); private Include defaultPropertyInclusion; private TimeZone timeZone = null; private Locale locale;
-
-
我们在配置文件可以找到所有有关
配置类所有属性的键
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0luT46ww-1620480784852)(C:\Users\Xingcl\AppData\Roaming\Typora\typora-user-images\image-20210508151518976.png)]
配置文件设置的值可以通过键值映射到配置类的属性
- 通过这个注解
@ConfigurationProperties
- 同时保证该类被注册到Ioc容器中
@Component
实体类
@Component
@ConfigurationProperties(prefix = "lxc")
//prefix 相当于给出一个键
public class PropertiesMapping {
public String nameTest;
public Map<Object, Object> map;
public List<Object> list;
public boolean flag;
}
配置文件
lxchaha:
nameTest: lxc
map: {haha: 1,hahe: 2}
list:
- a
- b
- c
- d
flag: true
映射结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N6WVE5eh-1620480784854)(C:\Users\Xingcl\AppData\Roaming\Typora\typora-user-images\image-20210508154218239.png)]
- 每个注解类都在自动装配的时候被注册到了扫描Ioc容器
- 通过**@ConfigurationProperties**注解装配具体的属性值
3.yaml松散绑定
当我们实体类中属性名和配置文件中不一致时会仍旧会装配成功
实体类属性列表
public String a;
public Map<Object, Object> map;
public List<Object> list;
public boolean flag;
配置文件
lxc:
map: { haha: 1,hahe: 2}
list:
- a
- b
- c
- d
flag: true
nameTest: lxc
映射结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8MmzQZTF-1620480784855)(C:\Users\Xingcl\AppData\Roaming\Typora\typora-user-images\image-20210508183306966.png)]
结论
- 配置文件的映射是靠实体类set方法完成的
- 会自动按配置文件键名去实体类中寻找指定的setXXX方法
- 所以属性的注入是靠set方法 di还可以通过构造函数?
4、jsr303校验
JSR303技术,JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 .
使用yaml
文件注入属性值时可以在注入过程中进行校验数据的而properties
是不支持的
-
在类上使用
@Validate
-
在对应属性上使用对应注解
-
空检查
@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=) Validates that the annotated string is between min and max included.日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前,验证成立的话被注释的元素一定是一个过去的日期
@Future 验证 Date 和 Calendar 对象是否在当前时间之后 ,验证成立的话被注释的元素一定是一个将来的日期
@Pattern 验证 String 对象是否符合正则表达式的规则,被注释的元素符合制定的正则表达式,regexp:正则表达式 flags: 指定 Pattern.Flag 的数组,表示正则表达式的相关选项。数值检查
建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为”“,Integer为null
@Min 验证 Number 和 String 对象是否大等于指定的值
@Max 验证 Number 和 String 对象是否小等于指定的值
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits 验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range(min=, max=) 被指定的元素必须在合适的范围内
@Range(min=10000,max=50000,message=”range.bean.wage”)
@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber信用卡验证
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)
————————————————
版权声明:本文为CSDN博主「Mr_温少」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28867949/article/details/78922520
-
-
5、复杂数据类型封装
映射属性时我们已经验证过了
-
当映射对象为map时
-
map名:'空格'{键1:'空格'值1,键值2:'空格'值2,键n:'空格'值n}
-
map: { haha: 1,hahe: 2}
-
-
映射对象为非键值对容器时
-
容器名: -value1 -value2 -valuen
-
list: - a - b - c - d
-
-
当映射对象为引用类型时
我们在实例域中加入一个引用类型的属性
public String nameTest;
public Map<Object, Object> map;
public List<Object> list;
public boolean flag;
public HardObject hardObject;
配置文件(分级注入就好了)
lxc:
map: { haha: 1,hahe: 2}
list:
- a
- b
- c
- d
flag: true
nameTest: lxc
hardObject:
name: lll
结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GaDf12ty-1620480784856)(C:\Users\Xingcl\AppData\Roaming\Typora\typora-user-images\image-20210508185752129.png)]
6、propertise SpEl
的使用
SpEL是什么?
- Spring表达式语言
- 运行时查询和操作数据
- 使用类似于jsp的el表达式
- ymal配置文件是不支持的
实体类
@Component
@PropertySource(value = "classpath:selfConfig.properties")
//从指定的peoperties文件加载属性值 不局限于配置文件
public class HardObject {
@Value("${name}")
String name;
@Value("${uuid}")
String uuid;
public void setName(String name) {
this.name = name;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
@Override
public String toString() {
return "HardObject{" +
"name='" + name + '\'' +
", uuid='" + uuid + '\'' +
'}';
}
}
属性配置文件
name=lxc
uuid=${random.uuid}
- 类路径下的
selfConfig.properties
结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tQtfK8dx-1620480784857)(C:\Users\Xingcl\AppData\Roaming\Typora\typora-user-images\image-20210508213128266.png)]
我们可以使用SpEl 在peopertise 中进行一些运行时灵活的操作