SpringBoot-05-YAML介绍及使用

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 SpringBoot-05-YAML介绍及使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

4.YAML

  • Spring Boot 提供了大量的自动配置,极大地简化了spring 应用的开发过程,当用户创建了一个 Spring Boot 项目后,即使不进行任何配置,该项目也能顺利的运行起来,因为SpringBoot在底层都给我们自动配置好了。当然,用户也可以根据自身的需要使用配置文件修改 Spring Boot 的默认设置。

  • SpringBoot 默认使用以下 2 种全局的配置文件,其文件名是固定的。

    • application.properties 语法结构:key=value
      • application.yml 语法结构:key:空格value
  • application.yml 是一种使用 YAML 语言编写的文件,它与 application.properties 一样,可以在 Spring Boot 启动时被自动读取,修改 Spring Boot 自动配置的默认值。

4.1 YAML简介

  • YAML 全称 YAML Ain’t Markup Language,它是一种以数据为中心的标记语言,比 XML 和 JSON 更适合作为配置文件。

  • 想要使用 YAML 作为属性配置文件(以 .yml 或 .yaml 结尾),需要将 SnakeYAML 库添加到 classpath 下,Spring Boot 中的 spring-boot-starter-web 或 spring-boot-starter 都对 SnakeYAML 库做了集成, 只要项目中引用了这两个 Starter 中的任何一个,Spring Boot 会自动添加 SnakeYAML 库到 classpath 下。

  • 同名配置文件的优先级:properties>yml>yaml

  • 例如:application.yml 属性配置文件

#更改项目端口号
server:
  port : 8082

spring:
  mail:
    host : smtp.qq.com
    username : 1322222222226@qq.com
    password : nnnnnnnnnnnnnnnn
    properties.mail.smtp.ssl.enable : true

datasource:
  url : jdbc:mysql://localhost:3306/school?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
  username : root
  password : 123456
  driver-class-name : com.mysql.cj.jdbc.Driver
  • 标记语言:以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml
<server>
	<port>8082</port>
</server>
  • YAML 常用写法:YAML 支持以下三种数据结构:
    • 对象:键值对的集合
    • 数组:一组按次序排列的值
    • 字面量:单个的、不可拆分的值

4.2 YAML字面量写法

字面量是指单个的,不可拆分的值,例如:数字、字符串、布尔值、以及日期等。

在 YAML 中,使用“key:[空格]value**”**的形式表示一对键值对(空格不能省略),如username : root

字面量直接写在键值对的“value**”**中即可,且默认情况下字符串是不需要使用单引号或双引号的。

  • 若字符串使用单引号,则会转义特殊字符。
  • 注意:属性和值的大小写都是十分敏感的。例子:
name: zhangsan \n lisi
  • 输入结果
zhangsan \n lisi
  • 若字符串使用双引号,则不会转义特殊字符,特殊字符会输出为其本身想表达的含义
name: zhangsan \n lisi
  • 输入结果
zhangsan
lisi

4.3 YAML 对象写法

  • 在 YAML 中,对象可能包含多个属性,每一个属性都是一对键值对。

  • YAML 为对象提供了 2 种写法:

  • 普通写法,使用缩进表示对象与属性的层级关系。

student:
  name : zk
  age: 3
  • 行内写法:
student:{ name : zk,age:3}

4.4 YAML 数组写法

  • YAML 使用“-”表示数组中的元素,普通写法如下:- 空格 item
animal:
  - dog
  - cat
  - pig
  • 行内写法
animal: [dog,cat,pig]
  • 复合结构:以上三种数据结构可以任意组合使用,以实现不同的用户需求
  • YAML 组织结构:一个 YAML 文件可以由一个或多个文档组成,文档之间使用“—**”作为分隔符,且个文档相互独立,互不干扰。如果 YAML 文件只包含一个文档,则“—”**分隔符可以省略。
---
#更改项目端口号
server:
  port : 8082
---

spring:
  mail:
    host : smtp.qq.com
    username : 13nnnnnnnnnnn@qq.com
    password : nnnnnnnnnnnnnnnnn
    properties.mail.smtp.ssl.enable : true
---
datasource:
  url : jdbc:mysql://localhost:3306/school?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
  username : root
  password : 123456
  driver-class-name : com.mysql.cj.jdbc.Driver
---

4.5 通过yaml给对象赋值

  • redis、temple,全局配置类方式都是这样的方式获取值
  • 在application.yml中准备实体类Person的数据
  • 属性名是按照setget方法
persion :
  name: 张三
  age: 18
  dog:
    name: 修勾
    age: 2
  goshool: true
  birthy: 2022/07/29
  maps: {k1: v1,k2: v2}
  list:
    - java
    - python
    - go
  • 在实体类上加@ConfigurationProperties(prefix = “person”)注解

在这里插入图片描述

  • 需要导入依赖
<dependency>
	<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
  • 实体类和yml配置文件的属性值绑定,给注解里添加属性:prefix = “person”
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Dog dog;
    private Boolean shool;
    private Date birthy;
    private Map<String,Object>maps;
    private List<Object> list;
}

@ConfigurationProperties作用:

  • 将配置文件中配置的每一个属性的值,映射到这个组件中:
  • 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
  • 参数prefix=”person”:将配置文件中的person下面的所有属性一对应
  • 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
  • 测试结果
@Test
void test03(){
	System.out.println(person);
}
//Person(name=张三, age=18, dog=Dog(name=修勾, age=2), goshool=true, birthy=Fri Jul 29 00:00:00 CST 2022, maps={k1=v1, k2=v2}, list=[java, python, go])

如果要使用propertiesi配置文件可能导入时存在乱码现象,需要在IDEA中进行调整,我们这里直接使用yml文件,将默认的application.properties后缀修改为yml

  • 配置文件除了yml还有常用的properties,我们没有讲,propertiesi配置文件在写中文的时候,会有乱码,我们需要去DEA中设置编码格式为UTF-8;settings->FileEncodings中配置;

4.6通过properties给实体类赋值

  • 创建自定义的properties:myapplication.properties
name=修勾
age=3
  • 实体类进行关联,需使用注解@PropertySource加载指定的配置文件
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
@PropertySource(value = "classpath:myapplication.properties")
public class Dog {
    /*spring的spel表达式*/
   	@Value("${name}")
    private String name;
    @Value("${age}")
    private Integer age;
    @Value("${12*2}")
    private Integer age2;
    @Value("true")
    private Boolean age2;
}
  • 测试结果
@Test
void test03(){
    System.out.println(dog);
    System.out.println(person);
}
//Dog(name=修勾, age=3)

4.7 yml占位符的使用

person :
  name: 张三${random.uuid}
  age: ${random.int}
  pets: dog
  dog:
    name: ${person.pets:hello}修勾
    age: 2
  goshool: true
  birthy: 2022/07/29
  maps: {k1: v1,k2: v2}
  list:
    - java
    - python
    - go
  • 测试

Person(name=张三45c407f2-9ebe-43b3-a496-108444b8fd75, age=1584343770, dog=Dog(name=dog修勾, age=2), goshool=true, birthy=Fri Jul 29 00:00:00 CST 2022, maps={k1=v1, k2=v2}, list=[java, python, go])

  • 两种方式对比

在这里插入图片描述

  • ConfigurationProperties只需要写一次即可,value则需要每个字段都添加

  • 松散绑定:这个什么意思呢?比如我的yml中写的last-name,这个和实体类属性lastName,是一样的,-后面跟着的字母默认是大写的。这就是松散绑定

  • JSR303数据校验,这个就是我们可以在字段是增加一层过滤器验证,可以保证数据的合法性复杂类型封装,yml中可以封装对象,使用@value就不支持

  • 结论:

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

4.8 JSR303数据校验

  • spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。我们这里来写个注解让我们的name只能支持Email格式

  • @validated作用在要验证的类上,见博客springmvc数据校验

下一篇:SpringBoot-06-配置文件介绍和使用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123866.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!