• SpringBoot学习笔记(三)


    本文主要介绍,SpringBoot+yaml和SpringBoot+JSR303

    一、SpringBoot+yaml

    1.SpringBoot配置文件

    SpringBoot使用的是一个全局的配置文件,且配置文件是固定的

    • application.properties
    • application.yaml或者application.yml

    2.什么是yam

    "YAML Ain't a Markup Language","Yet Another Markup Language"

    YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。
    yaml这种语言是以数据作为中心,为不是以标记语言为重点

    3.yaml基本语法

    • 大小写敏感
    • 空格敏感
    • 使用缩进表示层级关系
    • 缩进不允许使用Tab,只允许使用空格
    • 缩进的空格数不重要,只要相同层级的元素左对齐即可
    • # 表示注释

    4.yaml数据类型

    YAML 支持以下几种数据类型:(这部分的内容来自:菜鸟教程)
    1.对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

    key:空格value
    

    2.数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
    a.以 - 开头的行表示构成一个数组:

     -A
     -B
     -C
    

    b.支持多维数组,可以使用行内表示:

    key: [value1, value2, ...]
    

    c.数据结构的子成员是一个数组,则可以在该项下面缩进一个空格。

    -
     - A
     - B
     - C
    

    一个相对复杂的例子:

    companies:
        -
            id: 1
            name: company1
            price: 200W
        -
            id: 2
            name: company2
            price: 500W
    

    意思是 companies 属性是一个数组,每一个数组元素又是由 id、name、price 三个属性构成。

    d.数组也可以使用流式(flow)的方式表示:

    companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]
    

    3.纯量(scalars):单个的、不可再分的值,包括

    字符串
    布尔值
    整数
    浮点数
    Null
    时间
    日期
    

    使用一个例子来快速了解纯量的基本使用:

    boolean: 
        - TRUE  #true,True都可以
        - FALSE  #false,False都可以
    float:
        - 3.14
        - 6.8523015e+5  #可以使用科学计数法
    int:
        - 123
        - 0b1010_0111_0100_1010_1110    #二进制表示
    null:
        nodeName: 'node'
        parent: ~  #使用~表示null
    string:
        - 哈哈
        - 'Hello world'  #可以使用双引号或者单引号包裹特殊字符
        - newline
          newline2    #字符串可以拆成多行,每一行会被转化成一个空格
    date:
        - 2018-02-17    #日期必须使用ISO 8601格式,即yyyy-MM-dd
    datetime: 
        -  2018-02-17T15:02:31+08:00    #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
    

    4.引用
    & 锚点和 * 别名,可以用来引用:
    & 用来建立锚点(defaults),<< 表示合并到当前数据,* 用来引用锚点。

    defaults: &defaults
      adapter:  postgres
      host:     localhost
    
    development:
      database: myapp_development
      <<: *defaults
    
    test:
      database: myapp_test
      <<: *defaults
    

    相当于:

    defaults:
      adapter:  postgres
      host:     localhost
    
    development:
      database: myapp_development
      adapter:  postgres
      host:     localhost
    
    test:
      database: myapp_test
      adapter:  postgres
      host:     localhost
    

    5.yaml中单引号与双引号

    • 单引号('')
      yaml中,单引号会转义特殊字符,特殊字符最终会以普通字符串形式输出
      比如:
    name: 'zhouzhou 
     hahah'
    

    输出:zhouzhou hahah

    • 双引号("")
      yaml中,双引号不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思
    name: "zhouzhou 
     hahah"
    

    输出:zhouzhou 换行 hahah

    6.yaml注入配置文件

    yaml文件更强大的地方在于,它可以给我们的实体类直接注入匹配值!
    a、在springboot项目中的resources目录下新建一个文件 application.yml
    image
    b、编写一个实体类 Person

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Person {
        private String name;
        private Integer age;
        private Boolean happy;
        private Date birth;
        private Map<String,Object> maps;
        private List<Object> lists;
        private Dog dog;
        //有参无参构造、get、set方法、toString()方法,我这里用了lombok 
    }
    

    c.使用yaml配置的方式进行注入

    server:
      port: 8081
    
    person:
     name: zhou
     age: 1
     happy: true
     birth: 2020/05/17
     maps: {k1: ddd,K2: xxx}
     lists:
       code
       music
       eat
      dog:
        name: 大黄
        age: 3
    

    d.将所有值都注入到我们的person类中:

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Component //注册bean
    @ConfigurationProperties(prefix = "person")
    public class Person {
        private String name;
        private Integer age;
        private Boolean happy;
        private Date birth;
        private Map<String,Object> maps;
        private List<Object> lists;
        private Dog dog;
        //有参无参构造、get、set方法、toString()方法,我这里用了lombok
    }
    

    e.IDEA 提示,springboot配置注解处理器没有找到。
    image
    我们可以查看文档,找到一个依赖!
    image

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    

    f.测试:

    import com.zhou.pojo.Person;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    class MyspringbootApplicationTests {
        @Autowired //将person自动注入进来
        Person person;
        @Test
        void contextLoads() {
            //之前一直打印不出来person信息,我下面这个输出竟然写的是System.out.println("person");好蠢的错误。
            System.out.println(person);
        }
    }
    

    结果:全部注入成功。
    image

    【注意】properties配置文件在写中文的时候,会有乱码 , 我们需要去IDEA中设置编码格式为UTF-8;
    image

    7.yaml支持松散绑定

    比如,在yaml文件中用横杠-连接两个单词last-name形成的属性名称,与在类中用驼峰命名法形成的属性名称lastName,可以被识别。

    8.多环境切换(yaml来做吧)

    1.以 profile 实现多环境切换:
    profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境。
    详细介绍可查看这篇博客:最详细的profile的使用

    2.以 yaml 文件实现多环境切换:
    主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本。
    例如:

    • application-test.properties 代表测试环境配置
    • application-dev.properties 代表开发环境配置
      但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;
      我们需要通过一个配置来选择需要激活的环境:
    #比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试;
    #我们启动SpringBoot,就可以看到已经切换到dev下的配置了;
    spring.profiles.active=dev
    

    yaml的多文档块
    和properties配置文件中一样,但是使用yml去实现不需要创建多个配置文件,更加方便了 !

    server:
      port: 8081
    #选择要激活那个环境块
    spring:
      profiles:
        active: prod
     
     
    ---
    server:
      port: 8083
    spring:
      profiles: dev #配置环境的名称
     
     
    ---
     
     
    server:
      port: 8084
    spring:
      profiles: prod  #配置环境的名称
    

    【注意:】如果yml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的。
    外部加载配置文件的方式十分多,官方外部配置文件说明参考文档:

    image

    SpringBoot会从这四个位置全部加载主配置文件,高优先级的配置会覆盖低优先级的配置,并且互补配置;

    • tip:项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;这种情况,一般是后期运维做的多,相同配置,外部指定的配置文件优先级最高
    java -jar spring-boot-config.jar --spring.config.location=F:/application.properties
    

    总结:

    配置yml和配置properties都可以获取到值 , 强烈推荐 yml;
    如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
    如果专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties。

    二、SpringBoot+JSR303数据校验

    后端校验技术:JSR303数据校验(目的:增加一层过滤器验证,可以保证数据的合法性)

    1.JSR303基本校验规则:

    空检查 
    @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=)
    

    2.JSR303的使用

    第一步:引入依赖

    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    

    第二步:依照需求应用
    image

    可以上网搜索相关设置,也可以查看源码。

    image

    个人学习笔记,针对本人在自学中遇到的问题。

  • 相关阅读:
    赫尔维茨公式
    从解析几何的角度分析二次型
    Struts 1 Struts 2
    记一次服务器被入侵的调查取证
    契约式设计 契约式编程 Design by contract
    lsblk df
    Linux Find Out Last System Reboot Time and Date Command 登录安全 开关机 记录 帐号审计 历史记录命令条数
    Infrastructure for container projects.
    更新文档 版本控制 多版本并发控制
    Building Microservices: Using an API Gateway
  • 原文地址:https://www.cnblogs.com/1693977889zz/p/14559023.html
Copyright © 2020-2023  润新知