SpringBoot中YAML配置文件实例详解

 更新时间:2023年04月10日 11:41:02   作者:准Java全栈开发工程师  
前面一直在使用properties配置文件,spring boot也支持yaml配置文件,下面这篇文章主要给大家介绍了关于SpringBoot中YAML配置文件的相关资料,需要的朋友可以参考下

一、YAML 简介

1、什么是 YAML ?

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

2、优点

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

3、扩展名

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

4、语法规则

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

5、格式

server:
  port: 80

切记:属性值前面必须有一个空格。

port 是 server 下的一个属性,根据属性层级之间使用多行描述,以及使用缩进表示的规则,port 的书写位置如上所示,但一般情况下,这种格式我们无需过多纠结,我们回车换行后自动提供的格式一般都是正确的。 6、数组数据

name: 准Java全栈开发工程师
server:
  port: 80
# 数组格式
likes:
  - game
  - movie
  - music

数组数据的属性值换行书写,以 “-” 减号开头,注意属性值前空格,如上述 likes 所示。

二、三种配置文件

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

1、properties 类型

在未接触到 yaml 之前,我们的配置文件大多数都是以 properties 结尾的文件。

server.port=80

格式为:属性名=属性值 。

这种方式还是非常常见的,我们之前在配置连接数据库相关信息的 jdbc.properties 文件也是使用的该方式。

2、yml 类型

server:
  port: 81

将端口号设置为 81 。

3、yaml 类型

yml 和 yaml 只是扩展名不同而已,其实是一种类型的配置文件。

server:
  port: 82

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

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);
    }
}

将要读取的数据定义为属性,使用 @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]"));
    }
}

SpringBoot 提供有 Environment 对象,可以将配置文件中的所有数据都封装到该对象中,使用 getProperty 方法,将想要读取的数据名作为参数传入即可。

4、方式三:自定义对象

user:
  name: 准Java全栈开发工程师
  age: 22
  likes:
    - music
    - game
    - movie

对于配置类中的 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和构造器方法省略
}

和我们定义实体类没有太大的区别,只是这次不再是和数据库表中的字段对应,而是和配置文件中定义的数据对应。

除此之外,还需要使用 ConfigurationProperties 注解加载配置文件,使用 prefix 指定加载数据的前缀。

@SpringBootTest
class DemoApplicationTests {
    @Autowired
    private User user;

    @Test
    void contextLoads() {
        System.out.println(user);
    }
}

使用该方式在定义实体类时,会报红提示

我们只需要在 pom.xml 文件中导入相应的依赖即可。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

总结

到此这篇关于SpringBoot中YAML配置文件的文章就介绍到这了,更多相关SpringBoot YAML配置文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 多线程的同步几种方法

    java 多线程的同步几种方法

    这篇文章主要介绍了java 多线程的同步几种方法的相关资料,这里提供5种方法,需要的朋友可以参考下
    2017-09-09
  • java判断字符串是否为数字的方法小结

    java判断字符串是否为数字的方法小结

    这篇文章主要介绍了java判断字符串是否为数字的方法,分别讲述了使用Java自带函数、正则表达式及ascii码三种方法进行字符串判断的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 浅谈java中的路径表示

    浅谈java中的路径表示

    下面小编就为大家带来一篇浅谈java中的路径表示。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 使用java获取md5值的两种方法

    使用java获取md5值的两种方法

    本篇文章是对使用java获取md5值的两种方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 解读@Scheduled任务调度/定时任务非分布式

    解读@Scheduled任务调度/定时任务非分布式

    这篇文章主要介绍了解读@Scheduled任务调度/定时任务非分布式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java服务假死之生产事故的排查与优化问题

    Java服务假死之生产事故的排查与优化问题

    在服务器上通过curl命令调用一个Java服务的查询接口,半天没有任何响应,怎么进行这一现象排查呢,下面小编给大家记一次生产事故的排查与优化——Java服务假死问题,感兴趣的朋友一起看看吧
    2022-07-07
  • Java实现单链表基础操作

    Java实现单链表基础操作

    大家好,本篇文章主要讲的是Java实现单链表基础操作,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 在Spring中使用JDBC和JDBC模板的讲解

    在Spring中使用JDBC和JDBC模板的讲解

    今天小编就为大家分享一篇关于在Spring中使用JDBC和JDBC模板的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java实现ZooKeeper的zNode监控

    Java实现ZooKeeper的zNode监控

    这篇文章主要介绍了Java实现ZooKeeper的zNode监控问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-08-08
  • SpringBoot升级3.2报错Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String的解决方案

    SpringBoot升级3.2报错Invalid value type for 

    这篇文章给大家介绍了SpringBoot升级3.2报错Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String的解决方案,文中有详细的原因分析,需要的朋友可以参考下
    2023-12-12

最新评论