【SpringBoot学习笔记 二】YAML格式文件配置方式详解

简介: 【SpringBoot学习笔记 二】YAML格式文件配置方式详解

在初始化的项目中有个预置文件application.properties,这是SpringBoot的配置文件。SpringBoot 默认使用以下 2 种全局的配置文件,其文件名是固定的。

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

大多数情况下我们使用的文件是application.yml ,所以本篇Blog来详细看下YAML配置文件是怎么作用的,如何在SpringBoot中使用。

YAML配置文件

YAML 全称 YAML Ain't Markup Language(YAML不是一种标记语言),它是一种以数据为中心的标记语言,比 XML 和 JSON 更适合作为配置文件,怎么理解呢?就是这个配置文件的内容单纯的就是数据,通过缩进或者简单的特殊符号标识结构,比XML的一堆标签或者JSON的一堆括号更直接和清晰,例如同样的配置,用xml:

<server>
    <port>8081<port>
</server>

如果用yaml标记:

server:
  port: 8081

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

基本语法

YAML 的基本语法原则有如下两条:

  • 使用缩进表示层级关系,缩进时不允许使用 Tab 键,只允许使用空格,空格多少个无所谓只要是左边对齐的一列数据都是同一个层级的
  • 属性和值的大小写都十分敏感

只要满足这两条基本的语法,就不会出问题。

常用写法

YAML的常用写法有三种,字面量、对象以及数组,分类进行一下示例

字面量

字面量是指单个的,不可拆分的值,例如:数字、字符串、布尔值、以及日期等,在 YAML 中,使用key:[空格]value的形式表示一对键值对(空格不能省略)

K: V

字面量直接写在V的位置就可以 , 字符串默认不用加上双引号或者单引号,如果字符串使用了单引号或者双引号对特殊字符的规定如下,例如\n本身的含义是换行操作

  • 双引号,会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思:name: "田 \n 郭" ,则双引号下转义为换行操作:
  • 单引号,不会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出,name: '田 \n 郭' ,则输出为:name: '田 \n 郭'

网上关于转义的操作各种资料存在误解,建议看下译文yaml中该使用引号么

数组

YAML 使用-表示数组中的元素,普通写法如下:

pets:
  -dog
  -cat
  -pig

行内写法如下:

pets: [dog,cat,pig]

对象

在 YAML 中,对象可能包含多个属性,每一个属性都是一对键值对,普通写法如下:

person:
    name: tml
    age: 30

行内写法如下:

person: {name: tml,age: 30}

复合结构

当然我们大多数使用的时候上述三种写法都会用到,复合使用:

person:
  name: tml
  age: 30
  pets:
    -dog
    -cat
    -pig
  car:
    name: 蔚来es6

YAML组织结构

一个 YAML 文件可以由一个或多个文档组成,文档之间使用---作为分隔符,且各文档相互独立,互不干扰。如果 YAML 文件只包含一个文档,则---分隔符可以省略。

---
person:
  name: tml
  age: 30
  pets:
    -dog
    -cat
    -pig
  car:
    name: 蔚来es6
---
person:
  name: gcy
  age: 30
---

但是强烈不建议这么做,我们最好把各个文档和文件分开来,结构清晰一些

SpringBoot配置绑定

yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值,也就是我们读取配置再也不用那么麻烦了,还需要写个文件读取类什么的,直接通过注解就可以自动获取,有两种方式:

  • @ConfigurationProperties配置yaml自动JavaBean绑定
  • @Value配置yaml单个属性值绑定
  • @Value配置外部配置文件属性绑定

接下来通过一个实践来体会下这三种配置绑定方式。

yaml配置绑定实践

首先我们需要编写yaml配置文件和一个外部配置文件,分别看看yaml自动配置绑定和外部配置文件配置绑定方法是什么样的,按照如下结构进行实践:

1 yaml配置及外部properties配置编写

application.yml配置文件内容如下,我们尽量把所有语法都体验下:

person:
  name: tml
  age: 30
  pets:
    -dog
    -cat
    -pig
  car:
    name: 蔚来es6
url:
  domain: www.baidu.com
  location: china

application.properties配置文件内容如下:

spring.application.name=springboot

2 配置注入类编写

我们需要编写两个配置注入类,分别是Person和Car

Person.java

package com.example.springboot.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * * @Name Person
 * * @Description
 * * @author tianmaolin
 * * @Data 2021/9/27
 */
@Component
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix = "person")
@PropertySource(value = "classpath:application.properties")
public class Person {
    //@ConfigurationProperties配置yaml自动JavaBean注入
    private String name;
    private Integer age;
    private List<String> pets;
    private Car car;
    //@Value配置yaml属性引入,SPEL表达式获取值
    @Value("${url.domain}")
    private String url;
    @Value("${url.location}")
    private String location;
    //@Value配置外部配置文件属性绑定
    @Value("${spring.application.name}")
    private String appName;
}

Car.java

package com.example.springboot.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;
/**
 * * @Name Car
 * * @Description
 * * @author tianmaolin
 * * @Data 2021/9/27
 */
@Component
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Car {
    private String name;
}

3 Controller编写

我们改造下Controller,让返回结果为person的内容

package com.example.springboot.controller;
import com.example.springboot.model.Person;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
/**
 * * @Name HelloSpringController
 * * @Description
 * * @author tianmaolin
 * * @Data 2021/9/22
 */
@Controller
public class HelloSpringController {
    @Resource
    private Person person;
    @ResponseBody
    @RequestMapping("/hello")
    public Person hello() {
        return person;
    }
}

4 打印请求测试

启动服务后我们请求下Controller进行测试,可以发现各项数据都被正确打印了:

@Value和@ConfigurationProperties

@Value 和 @ConfigurationProperties 注解都能读取配置文件中的属性值并绑定到 JavaBean 中,但两者存在以下不同。

  1. 使用位置不同,@ConfigurationProperties:标注在 JavaBean 的类名上;@Value:标注在 JavaBean 的属性上。
  2. 功能不同,@ConfigurationProperties:用于批量绑定配置文件中的配置;@Value:只能一个一个的指定需要绑定的配置。
  3. 松散绑定支持不同,@ConfigurationProperties:支持松散绑定(松散语法),@Vaule:不支持松散绑定。
  4. SpEL 支持不同,@ConfigurationProperties:不支持 SpEL 表达式;@Value:支持 SpEL 表达式。
  5. 复杂类型封装,@ConfigurationProperties:支持所有类型数据的封装,例如 Map、List、Set、以及对象等;@Value:只支持基本数据类型的封装,例如字符串、布尔值、整数等类型。
  6. 应用场景不同,@Value 和 @ConfigurationProperties 两个注解之间,并没有明显的优劣之分,它们只是适合的应用场景不同而已。

若只是获取配置文件中的某项值,则推荐使用 @Value 注解;若专门编写了一个 JavaBean 来和配置文件进行映射,则建议使用 @ConfigurationProperties 注解。我们在选用时,根据实际应用场景选择合适的注解能达到事半功倍的效果。

Spring Boot导入Spring配置

默认情况下,Spring Boot 中是不包含任何的 Spring 配置文件的,即使我们手动添加 Spring 配置文件到项目中,也不会被识别。那么 Spring Boot 项目无法导入 Spring 配置吗?其实Spring Boot 为了我们提供了以下 2 种方式来导入 Spring 配置:

  • 使用 @ImportResource 注解加载 Spring 配置文件
  • 使用全注解方式加载 Spring 配置

第二种方式使用全注解其实我们之前谈到过【Spring学习笔记 五】Spring注解及Java类配置开发,并且是SpringBoot中最主要的实现方式,另外一种方式可以简单了解下,例如在该项目的 resources 下添加一个名为 beans.xml 的 Spring 配置文件,配置代码如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="persionService" class="net.biancheng.www.service.impl.PersonServiceImpl"></bean>
</beans>

这样在SpringBoot启动时就会自动将该配置加入了

package com.example.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication
@ImportResource(locations = {"classpath:/beans.xml"})
public class SpringbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }
}

总结一下

yml文件到底是干嘛的终于搞明白了,现在再去看项目中的结构都清晰了很多,知道这些配置是干什么的了,感觉确实yml文件比较好,用对齐来表明结构,可以去掉冗余的文本标记,理解起来更方便了,同时SpringBoot对yml和配置文件的支持也很友好,直接注解注入读取,要知道这要是搁以前得写一个配置类去匹配配置文件的结构再去读取的,多么麻烦啊。

相关文章
|
15天前
|
JSON Java 数据格式
springboot中表字段映射中设置JSON格式字段映射
springboot中表字段映射中设置JSON格式字段映射
39 1
|
1月前
|
Java 数据库连接 Maven
springBoot:项目建立&配置修改&yaml的使用&resource 文件夹(二)
本文档介绍了如何创建一个基于Maven的项目,并配置阿里云仓库、数据库连接、端口号、自定义启动横幅及多环境配置等。同时,详细说明了如何使用YAML格式进行配置,以及如何处理静态资源和模板文件。文档还涵盖了Spring Boot项目的`application.properties`和`application.yaml`文件的配置方法,包括设置数据库驱动、URL、用户名、密码等关键信息,以及如何通过配置文件管理不同环境下的应用设置。
109 1
|
2月前
|
JSON Kubernetes API
深入理解Kubernetes配置:编写高效的YAML文件
深入理解Kubernetes配置:编写高效的YAML文件
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
54 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
|
1月前
|
Kubernetes Docker Perl
k8s常见故障--yaml文件检查没有问题 pod起不来(一直处于创建中)
k8s常见故障--yaml文件检查没有问题 pod起不来(一直处于创建中)
100 1
|
1月前
ingress相关yaml文件报错且相关资源一切正常解决方法
ingress相关yaml文件报错且相关资源一切正常解决方法
ingress相关yaml文件报错且相关资源一切正常解决方法
|
1月前
yolov5的coco128.yaml的配置信息详解
这篇文章详细解释了YOLOv5的`coco128.yaml`配置文件中的参数,包括训练和验证数据集的路径、类别数量以及类别名称。
95 0
|
存储 NoSQL 数据库
mongodb3.2配置文件yaml格式 详解
mongodb3.x版本后就是要yaml语法格式的配置文件,下面是yaml配置文件格式如下:官方yaml配置文件选项参考:https://docs.mongodb.org/manual/ ... #configuration-file只能使用空格,不支持tab键,切记,原因你懂的。
1503 0
|
5月前
|
存储 运维 Serverless
函数计算产品使用问题之在YAML文件中配置了环境变量,但在PHP代码中无法读取到这些环境变量,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
下一篇
无影云桌面