• 【SpringBoot】04 初探YAML与配置


    什么是YAML?

    https://www.cnblogs.com/mindzone/p/12849789.html


    复合结构的语法

    一个标配JavaBean

    public class Person {
    
        private String name;
        private Integer age;
        private Boolean gender;
        private Date  birth;
        private Map<String,Object> map;
        private List<Object> list;
        private Dog puppy;
    // 省略 GETTER & SETTER & ToString
    }

    组合的DogBean

    public class Dog {
    
        private String name;
        private Integer age;
    // 省略 GETTER & SETTER & ToString
    }

    我们的YAML文件应该这样编写:

    person:
      name: 杰哥
      age: 18
      gender: true
      birth: 1995/09/05
      map:
        k1: v1
        k2: [1,3,4,7,9]
        k3: true
        k4: 3.14
      language: [C,C++,C#,Java]
      puppy:
        name: 二哈
        age: 3

     

    如何在SpringBoot中绑定JavaBean?

    1、打上@ConfigurationProperties注解和前缀属性

    2、SpringBoot 配置注解处理器 没有配置?

    我们点开【Open Documentation】查看

    版本太高都没有文档???

    索性更改文档查看【只要修改发行版本】

    https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/html/configuration-metadata.html#configuration-metadata-annotation-processor

    官方告诉我们需要导入这个依赖才能识别我们的yaml文件配置:

    经过测试,并不需要,这个提示警告可以忽视不用管

    3、打上@Componenet注解

    【否则初始化异常失败】

    4、我们如何证明yaml配置注入到了实例中?

    【使用测试类】

    运行查看结果

    Person{name='杰哥', age=18, gender=true, birth=Tue Sep 05 00:00:00 CST 1995, map={k1=v1, k2={0=1, 1=3, 2=4, 3=7, 4=9}, k3=true, k4=3.14}, list=[C, C++, C#, Java], puppy=null}

    由于狗类没有装配注解,顾打印为null

    狗类没有单独的写在yaml文件中,因为是组合在Person中的

    我们只需要注册到容器中即可

    查看人对象的结果


    使用SpringBoot的Properties配置来进行编写

    警告!在使用properties配置中文字符内容时,请先查看编码类型

    如果是GBK,很用可能在IDEA控制台输出的字符造成乱码问题

    建议全部改为UTF-8,并且,勾选自动适应

    配置编写:

    person.name = 张三
    person.age = 18
    person.birth = 1998/09/08
    person.gender = false
    person.map.k1 = 值1
    person.map.k2 = 值2
    person.list = Java,C,C++,C#
    person.puppy.name = 一条舔狗
    person.puppy.age = 1

    【注意,这里我并没删除在yml文件中的配置】

    打印结果是以properties为准的参数

    Person{name='张三', age=18, gender=false, birth=Tue Sep 08 00:00:00 CST 1998, map={k1=值1, k2=值2, k3=true, k4=3.14}, list=[Java, C, C++, C#], puppy=Dog{name='一条舔狗', age=1}}

     也就是说SpringBoot优先使用properties的配置注入参数


    代替@ConfigurationProperties的注入方法

    也可以使用@Value在类中硬编码注入参数

    @Value配合SPEL表达式来注入【这是来自Spring的注解】

    可以支持的方式【字面量、${} 配置注入,#{}SPEL表达式】

    现在我们这样使用

    把配置读取的注解注释掉

    直接使用@Value来注入

    测试


    @Value & @ConfigurationProperties的区别?

    【以下简称 @V & @CP

    - @CP 用于批量注入,支持松散绑定,不支持SPEL,支持JSR303校验,支持复杂类型封装

    - @V 用于单个注入,不支持松散绑定,支持SPEL,不支持JSR303校验,不支持复杂类型封装

    - properties 不支持SPEL表达式

    - yaml 支持SPEL表达式


    【Relaxed Binding】什么是松散绑定?

    例如我们的Bean属性标识符是小驼峰:

    private String lastName;

    @CP注解在配置文件中去匹配这个标识符的时候

    可以匹配这些规则的标识符:

    - person.lastName

    - person.last-name

    - person.last_ame

    - PERSON_LAST_NAME


    JSR303注入校验

    详细翻阅的校验注解种类参考:

    https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/

    https://blog.csdn.net/qq_28867949/article/details/78922520

    JSR303 对 @Value注入的校验是无效的,再三提示!!!

  • 相关阅读:
    TCP和UDP的一些区别: TCP提供可靠传输的机制:
    rpc和 http的区别
    熔断原理与实现Golang版
    源码解读 Golang 的 sync.Map 实现原理
    mysql底层为啥用b 树不用红黑树_MySQL索引底层数据结构
    一条sql 查询语句是如何执行的
    网络相关知识
    为什么遍历 Go map 是无序的?
    Go语言 参数传递究竟是值传递还是引用传递的问题分析
    解决goland debug 调试问题 Version of Delve is too old for this version of Go
  • 原文地址:https://www.cnblogs.com/mindzone/p/12849789.html
Copyright © 2020-2023  润新知