YAML文件

592 阅读3分钟

配置文件介绍

SpringBoot配置文件支持properties文件和YAML文件

docs.spring.io/spring-boot… 可以查找配置文件如何覆盖SpringBoot项目的默认配置。

YAML文件的扩展名为 .yml 或 .yaml ,它的基本要求如下:

  • 大小写敏感
  • 使用缩进代表层级关系
  • 相同的部分只出现一次

自定义配置简单数据类型

image.png

自定义配置对象数据

对象:

 属性名1: 属性值
 属性名2: 属性值

# 或者

对象: {属性名1: 属性值,属性名2: 属性值}

实例

# 学生1
 student1:
     sex: female
     age: 10
     address: beijing
 # 学生2
 student2: {sex: female,age: 10,address: beijing}

属性名前面的空格个数不限,在yml语法中,相同缩进代表同一个级别,只要每个属性前的空格数一样即可。

自定义配置集合数据

  • 语法
集合:
     - 值1
     - 值2
 # 或者
 集合: [值1,值2]
  • 实例
# 城市
 city1:
     - beijing
     - tianjin
     - shanghai
     - chongqing
 city2: [beijing,tianjin,shanghai,chongqing]
 # 集合中的元素是对象
 students:
     - name: baizhan
       age: 18
       score: 100
     - name: shangxuetang
       age: 28
       score: 88
     - name: chengxuyuan
       age: 38
       score: 90

注意:值与之前的 - 之间存在一个空格

读取配置文件的数据

使用@Value读取

可以通过@Value注解将配置文件中的值映射到一个Spring管理的Bean的字段上

@Controller
public class YmlController1 {
   @Value("${name}")
   private String name;
   @Value("${student1.age}")
   private int age;
   @Value("${city1[0]}")
   private String city1;
   @Value("${students[0].score}")
   private double score1;
   @RequestMapping("/yml1")
   @ResponseBody
   public String yml1(){
       System.out.println(name);
       System.out.println(age);
       System.out.println(city1);
       System.out.println(score1);
       return "hello springboot!";
  }
}

@Value只能映射简单数据类型,不能将yaml文件中的对象、集合映射到属性中。

使用@ConfigurationProperties读取

通过 @ConfigurationProperties(prefifix="对象") 可以将配置文件中的配置自动与实体进行映射,这样可以将yml文件中配置的对象属性直接映射到Bean当中。

配置文件

user:
id: 10001
username: shangxuetang
address:
  - beijing
  - tianjin
  - shanghai
  - chongqing
grades:
  - subject: math
    score: 100
  - subject: english
    score: 90

实体类

public class Grade {
   private String subject;
   private double score;
   // 省略getter/setter/tostring
}

读取配置文件

@Controller
@ConfigurationProperties(prefix = "user")
public class YmlController2 {
   private int id;
   private String username;
   private List<String> address;
   private List<Grade> grades;
   @RequestMapping("/yml2")
   @ResponseBody
   public String yml2(){
       System.out.println(id);
       System.out.println(username);
       System.out.println(address);
       System.out.println(grades);
       return "hello springboot!";
  }
}

占位符的使用

YAML文件中可以使用 ${} 占位符,它有两个作用

server:
    port: 8888
myconfig:
    myport: ${server.port}
@Value("${myconfig.myport}")
   private int port;

SpringBoot框架提供了一些生成随机数的方法可以在yml文件中使用:

  • ${random.value} :生成类似uuid的随机数,没有"-"连接
  • ${random.uuid} :生成一个uuid,有短杠连接
  • ${random.int} :随机取整型范围内的一个值
  • ${random.int(10)}:随机生成一个10以内的数
  • ${random.int(100,200)}:随机生成一个100-200 范围以内的数
  • ${random.long}:随机取长整型范围内的一个值
  • ${random.long(100,200)}:随机生成长整型100-200范围内的一个值

配置文件位置以及优先级

配置文件有如下存放位置:

  • 项目根目录下
  • 项目根目录下的/config子目录中
  • 项目的resources目录中
  • 项目的resources下的/config子目录中 这些目录下都可以存放两类配置文件,分别是 application.yml 和application.properties ,这些配置文件的优先级从高到低依次为:

项目根目录下的/config子目录中

  • config/application.properties
  • config/application.yml 项目根目录下
  • application.properties
  • application.yml 项目的resources下的/config子目录中
  • resources/config/application.properties
  • resources/config/application.yml 项目的resources目录中
  • resources/application.properties
  • resources/application.yml 优先级高的文件会覆盖优先级低的文件中的配置

bootstrap配置文件