Spring Boot项目中使用yaml配置文件

  • Post author:
  • Post category:其他


Spring Boot中的配置文件有两个格式:properties和yaml。一般情况下,两者可以随意使用。但是因为properties文件是无序的,yaml文件配置是有序的。所以当我们的配置文件有顺序要求或较复杂的数据结构时,就需要使用到yaml文件。

需要注意的是:

yaml配置文件目前不支持@PropertySource

,Spring Boot默认只加载名为application的配置文件。



一、YAML简介

YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。

它的基本语法规则如下。

  • 大小写敏感。
  • 使用缩进表示层级关系。
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要(一般2个或4个空格),只要相同层级的元素左侧对齐即可。
  • # 表示注释,从这个字符一直到行尾,都会被解析器忽略。

YAML 支持的数据结构有三种:

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 常量(scalars):单个的、不可再分的值



二、数据格式



(一)常量

YAML中提供了多种常量结构,包括:整数,浮点数,字符串,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: ~  #使用~表示null
string:
    - 哈哈
    - 'Hello world'  #可以使用双引号或者单引号包裹特殊字符
    - newline
      newline2    #字符串可以拆成多行,每一行会被转化成一个空格
date:
    - 2018-02-17    #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime: 
    -  2018-02-17T15:02:31+08:00    #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区



(二)数组

一个数据项:一个短横线后

加一个空格

加内容

hobbies:
  - Java
  - Basketball

另一种写法:

#表示[[Java,Basketball]]
-
  - Java
  - Basketball

一个相对复杂的例子:

#表示companies:[[id:1,name:company1,price:200w],[id:2,name:company2,price:500w]]
companies:
    -
        id: 1
        name: company1
        price: 200W
    -
        id: 2
        name: company2
        price: 500W

YAML中支持流式(flow)的方式表示数组,如:

companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]



(三)对象

格式为key: value。

注意:冒号后面要加一个空格


使用缩进表示层级关系:

key: 
    child-key: value
    child-key2: value2

YAML中同样支持流式(flow)语法表示对象,如:

key: {child-key: value, child-key2: value2}

对于复杂的对象格式,可以使用问号加一个空格代表一个复杂的key,配合一个冒号加一个空格代表一个value:

?  
    - complexkey1
    - complexkey2
:
    - complexvalue1
    - complexvalue2

含义为:对象的属性是一个数组[complexkey1,complexkey2],对应的值也是一个数组[complexvalue1,complexvalue2]



三、Spring Boot中使用示例

使用前注意:

找到IDEA的Settings中的Editor->File Encodings,将图中标红的配置都统一设置为UTF-8

,最后点击apply应用和ok。

在这里插入图片描述



yaml配置文件的位置:

application.yaml在Spring Boot中可以写在四个不同的位置,分别是如下位置

  1. 项目根目录下的config目录中
  2. 项目根目录下
  3. classpath下的config目录中
  4. classpath目录下

四个位置中的application.yaml文件的优先级按照上面列出的顺序依次降低。即如果有同一个属性在四个文件中都出现了,以优先级高的为准。



(一)配置服务器

首先在resources目录中新建一个application.yaml,删除application.properties

在这里插入图片描述

配置代码示例:

server:
  port: 8082
  servlet:
    context-path: /test


注意:缩进和冒号后的空格


启动项目,配置成功

在这里插入图片描述



(二)属性注入示例

首先创建Student类

@Component
public class Student {
  private long id;
  private List<String> hobbies;
  private List<Teacher> teachers;
  

  public long getId() {
    return id;
  }

  public void setId(long id) {
    this.id = id;
  }

  public List<String> getHobbies() {
    return hobbies;
  }

  public void setHobbies(List<String> hobbies) {
    this.hobbies = hobbies;
  }

  public List<Teacher> getTeachers() {
    return teachers;
  }

  public void setTeachers(List<Teacher> teachers) {
    this.teachers = teachers;
  }

}

新建Teacher类:

@Component
public class Teacher {
  private long id;
  private String name;

  @Override
  public String toString() {
    return "Teacher{" +
            "id=" + id +
            ", name='" + name + '\'' +
            '}';
  }

  public long getId() {
    return id;
  }

  public void setId(long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

application.yaml文件内容如下:

#容器配置
server:
  port: 8082
  servlet:
    context-path: /test
#属性注入
student:
  id: 1
  hobbies:
    --- rap
    - 打篮球
  teachers:
    - id: 1
      name: 语文老师
    - id: 2
      name: 数学老师

在Student类中加入@ConfigurationProperties(“student”)引入配置文件的属性,这样项目启动后对应属性就注入到该类中

在这里插入图片描述

新建ShowController类

@RestController
public class ShowController {

  @Autowired
  Student student;

  @RequestMapping(value="/show",produces = "text/plain;charset=UTF-8")
  public String show(){
    return "学号:"+student.getId()+"爱好:"+student.getHobbies()+"老师:"+student.getTeachers();
  }
}

启动项目,浏览器访问,效果如下:

在这里插入图片描述


参考博客:


https://www.cnblogs.com/sddai/p/9626392.html



https://www.jianshu.com/p/97222440cd08



版权声明:本文为huangjhai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。