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 \n hahah'

输出:zhouzhou \n hahah

  • 双引号("")
    yaml中,双引号不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思
name: "zhouzhou \n 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

posted @ 2021-03-25 16:01  江河湖泊  阅读(136)  评论(0编辑  收藏  举报