• 【SpringBoot】YAML 配置文件


    👉 博客主页:准Java全栈开发工程师
    👉 00年出生,即将进入职场闯荡,目标赚钱,可能会有人觉得我格局小、觉得俗,但不得不承认这个世界已经不再是以一条线来分割的平面,而是围绕财富旋转的球面,成为有钱人不是为了去掌控球体的转向,而是当有人恶意掌控时,努力保护好家人和自己。

    一、YAML 简介

    1、什么是 YAML ?

    • YAML(YAML Ain’t Markup Language),一种数据序列化格式。
    • 这种格式的配置文件近些年逐渐进入市场,并开始占据主导地位。

    2、优点

    • 较 xml 类型和 properties 类型相比,更容易阅读,结构也更加的清晰。
    • 容易与脚本语言交互。
    • 以数据为核心,重数据轻格式,轻格式并不是说可以不遵守格式,只是格式更加随性一些。

    3、扩展名

    • 扩展名有两种,无论是那个扩展名,都是 YAML 格式的配置文件,拥有 YAML 的属性。
      • .yml ,这种扩展名更加主流一些
      • .yaml

    4、语法规则

    • 对大小写非常敏感,如:定义 age 和 AGE 都会认为是两个属性。
    • 属性层级关系使用多行描述,每行结尾使用冒号结束。
    • 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格。
    • 空格个数并不重要,只要保证同层级的左侧对齐即可。
    • 属性值前面添加空格。
    • #号表示注释。

    5、格式

    server:
      port: 80
    
    • 1
    • 2
    • 切记:属性值前面必须有一个空格。
    • port 是 server 下的一个属性,根据属性层级之间使用多行描述,以及使用缩进表示的规则,port 的书写位置如上所示,但一般情况下,这种格式我们无需过多纠结,我们回车换行后自动提供的格式一般都是正确的。

    6、数组数据

    name: 准Java全栈开发工程师
    server:
      port: 80
    # 数组格式
    likes:
      - game
      - movie
      - music
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 数组数据的属性值换行书写,以 “-” 减号开头,注意属性值前空格,如上述 likes 所示。

    二、三种配置文件

    以配置端口号为例,介绍三种配置文件及其格式。

    1、properties 类型

    • 在未接触到 yaml 之前,我们的配置文件大多数都是以 properties 结尾的文件。
    server.port=80
    
    • 1
    • 格式为:属性名=属性值 。
    • 这种方式还是非常常见的,我们之前在配置连接数据库相关信息的 jdbc.properties 文件也是使用的该方式。

    2、yml 类型

    server:
      port: 81
    
    • 1
    • 2
    • 将端口号设置为 81 。

    3、yaml 类型

    • yml 和 yaml 只是扩展名不同而已,其实是一种类型的配置文件。
    server:
      port: 82
    
    • 1
    • 2

    4、优先级

    • 当项目中同时存在上述三个配置文件时,用采用那个配置文件呢?我们可以通过观察端口号来获得优先级顺序。
      在这里插入图片描述
    • 端口号为 80 ,说明优先采用了 properties 类型的配置文件,它的优先级最高。
    • 将 properties 配置文件中的配置内容删除,观察 .yaml 和 .yml 那种文件优先级更高。
      在这里插入图片描述
    • 端口号又变为了 81 ,说明 .yml 文件优先级更高一些,虽然 .yaml 只是不同的扩展名罢了。
    • 总结:优先级由高到低 properties > yml > yaml

    三、YAML 代码提示功能

    • 有很多小伙伴反应,说在写 YAML 文件时,代码不提示。
      在这里插入图片描述
    • 没有代码提示功能,对我们开发还是造成了一定的影响的,下面就带着大家来解决这个问题。
    • 首先进入到模块管理。
      在这里插入图片描述
    • 将 YAML 类型的两个配置文件添加。

    在这里插入图片描述

    • 选中创建的两个配置文件,完成后点击 “OK” 即可。

    在这里插入图片描述

    • 此时的配置文件已经变成了三个。

    在这里插入图片描述

    • 重新回到配置文件看是否实现了代码提示功能。

    在这里插入图片描述

    • 已经实现了代码提示功能,虽然是 YAML 文件,但是代码提示的还是按照 properties 类型进行的,并不影响,找到需要的属性直接回车后还是会呈现出 YAML 格式。
      在这里插入图片描述

    四、读取 YAML 配置文件中的数据

    1、数据准备

    sourceName: SpringBoot
    
    server:
      port: 80
    
    user:
      name: 准Java全栈开发工程师
      age: 22
      likes:
        - music
        - game
        - movie
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2、方式一:@Value

    @SpringBootTest
    class DemoApplicationTests {
    
        @Value("${sourceName}")
        private String sourceName;
        @Value("${server.port}")
        private Integer port;
        @Value("${user.likes[0]}")
        private String likes;
    
        @Test
        void contextLoads() {
            System.out.println(sourceName);
            System.out.println(port);
            System.out.println(likes);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 将要读取的数据定义为属性,使用 @Value 注解读取配置文件中的数据并注入给属性,之后在方法体中可以直接使用。

    3、方式二:Environment

    @SpringBootTest
    class DemoApplicationTests {
        @Autowired
        private Environment environment;
    
        @Test
        void contextLoads() {
            System.out.println(environment.getProperty("sourceName"));
            System.out.println(environment.getProperty("server.port"));
            System.out.println(environment.getProperty("user.likes[0]"));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • SpringBoot 提供有 Environment 对象,可以将配置文件中的所有数据都封装到该对象中,使用 getProperty 方法,将想要读取的数据名作为参数传入即可。

    4、方式三:自定义对象

    user:
      name: 准Java全栈开发工程师
      age: 22
      likes:
        - music
        - game
        - movie
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 对于配置类中的 user 数据,其下还有很多子层,如果我们想一下子将 user 的所有数据都取出,应该怎么做呢?将其封装为一个对象。
    @Component  // 将bean的创建工作交由Spring管理
    // @ConfigurationProperties 注解表示加载配置文件
    // 使用prefix前缀表示只加载指定前缀的数据
    @ConfigurationProperties(prefix = "user")
    public class User {
        private String name;
        private Integer age;
        private Object[] likes;
    	// get、set、toString和构造器方法省略
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 和我们定义实体类没有太大的区别,只是这次不再是和数据库表中的字段对应,而是和配置文件中定义的数据对应。
    • 除此之外,还需要使用 ConfigurationProperties 注解加载配置文件,使用 prefix 指定加载数据的前缀。
    @SpringBootTest
    class DemoApplicationTests {
        @Autowired
        private User user;
    
        @Test
        void contextLoads() {
            System.out.println(user);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 使用该方式在定义实体类时,会报红提示

    在这里插入图片描述

    • 我们只需要在 pom.xml 文件中导入相应的依赖即可。
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    👉 以上就是文章的全部内容啦,诸佬如果有任何建议都可以提哦。
    👉 创作不易,如果觉得对您有帮助的话,欢迎关注✨点赞👍收藏📂哦。

  • 相关阅读:
    joblib嵌套式并行运行方式
    PyTorch深度学习(30)OpenCV图像处理
    Flutter快学快用04 代码规范:实践开发 Flutter 编程代码规范工具
    micropython 可视化音频 频谱解析(应该是全网首家)(预告,还没研究完成)
    计算机毕业设计Java校园外卖零食商城系统(源码+系统+mysql数据库+Lw文档)
    el-table-column 某些通过接口返回的section设置为禁用
    机器学习:争取被遗忘的权利
    CentOS下Redis6.x安装教程
    jsp JSTL标签详细示例(c:if与c:forEach)
    MySQL分区、主从复制,数据库优化
  • 原文地址:https://blog.csdn.net/Coder_Farmer/article/details/125328986