2021年3月25日星期四

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: ~ #使用~表示nullstring: - 哈哈 - 'Hello world' #可以使用双引号或者单引号包裹特殊字符 - newline  newline2 #字符串可以拆成多行,每一行会被转化成一个空格date: - 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dddatetime:  - 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

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

defaults: &defaults adapter: postgres host:  localhostdevelopment: database: myapp_development <<: *defaultstest: database: myapp_test <<: *defaults

相当于:

defaults: adapter: postgres host:  localhostdevelopment: database: myapp_development adapter: postgres host:  localhosttest: 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@NoArgsConstructorpublic 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: 8081person: 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;@SpringBootTestclass 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: 8083spring: profiles: dev #配置环境的名称 --- server: port: 8084spring: 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









原文转载:http://www.shaoqun.com/a/642733.html

跨境电商:https://www.ikjzd.com/

usps:https://www.ikjzd.com/w/513

萌店:https://www.ikjzd.com/w/1538


本文主要介绍,SpringBoot+yaml和SpringBoot+JSR303一、SpringBoot+yaml1.SpringBoot配置文件SpringBoot使用的是一个全局的配置文件,且配置文件是固定的application.propertiesapplication.yaml或者application.yml2.什么是yam"YAMLAin'taMarkupLangu
aca:https://www.ikjzd.com/w/1371
声网:https://www.ikjzd.com/w/2176
淘粉8:https://www.ikjzd.com/w/1725
如何使用KEEPA:https://www.ikjzd.com/tl/98506
亚马逊卖家优秀的分析工具Fetcher!:https://www.ikjzd.com/home/19178
不烧广告等死,烧广告穷死 | 旺季营销,6招教你省下广告费:https://www.ikjzd.com/home/132401

没有评论:

发表评论