ymal 文件的基础使用和 properties 的区别

本文详细介绍了YAML文件的使用,包括语法规则、属性值注入、松散绑定和JSR303数据校验。对比了YAML与properties文件的区别,强调了YAML的可读性和功能优势。同时,展示了如何通过@ConfigurationProperties注解实现属性值的自动装配,并探讨了在实体类属性名与配置文件不一致时的松散绑定。最后,讨论了JSR303校验技术以及复杂数据类型的封装,并指出YAML不支持SpEL表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

yaml 文件的使用

springboot配置文件可以使用application.properties也可以使用application.yamlapplication.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 中进行一些运行时灵活的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值