zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    PostgreSQL 安装和使用
    动态sql
    知识储备
    java空和非空判断
    我的第一篇博客
    正式工作:PreparedStatement 参与的
    mysql part2DML(数据操作语言)
    DCL(权限 ,用户)
    DQL(数据查询语言)
    准备工作:Eclipse 导入 mysql连接java 的jar包
  • 原文地址:https://www.cnblogs.com/1693977889zz/p/14559023.html
Copyright © 2011-2022 走看看