SpringBoot yml配置文件

在 SpringBoot 项目中默认的配置文件是 application.properties,但是实际项目中我们一般会使用 application.yml 文件。本文主要讲解在 SpringBoot 中读取 yml 配置的几种方式。

YAML 的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。

 

1. yml 文件语法规则

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • # 表示注释,从这个字符一直到行尾,都会被解析器忽略
  • key: value 格式书写。key 后面跟着冒号,再后面跟着一个空格,然后是值
  • 可以使用 "-小写字母" 或 "_小写字母" 来代替 "大写字母",如 userName 与 user-name ,user_name 含义相同。

 

2. yml 数据表示方式

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

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

2.1 纯量

直接的 key: value ,例如:

age: 18
name: mysgk

注:

字符串默认不用加上单引号或者双引号;
"":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思 name: "zhangsan \n lisi":输出;zhangsan 换行 lisi
'':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据 name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi

2.2 对象

第一行定义对象,在下一行来写对象的属性和值的关系;注意缩进(不支持tab,需要使用空格),例如:

person:
    age: 18
    name: mysgk

2.3 数组

用 - 值表示数组中的一个元素,例如

hands:
    - left
    - right

 

3. 使用 @value 注解读取

如果只需要配置文件中的少量的值,使用 @Value 注解是最简单方便的方式。这种方式是spring最早提供的方式,通过@Value注解的方式,该注解用在属性上,但是要求该属性所在的类必须要被spring管理。

例如,我们在 application.yml 中配置一段内容:

website:
  host: codebaoku

我们在代码中可以这样取值:

@Value("${website.host}")
public String host;	

注:此处 host 所在的类需要是一个组件,如果是实体类就需要加上 @Component 注解

另外,使用 @Value 注解方式读取 application.properties 中配置的内容,与读取 yml 一样。

application.properties 中配置内容如下:

website.host: codebaoku

代码中读取方式完全相同。

 

4. 使用 @ConfigurationProperties 注解读取

如果需要一个 JavaBean 来专门映射配置的话,我们一般会使用 @ConfigurationProperties 注解来进行读取。@ConfigurationProperties 注解是 springboot 提供的,在 springboot 中大量使用,下面看其用法:

student:
    age: 18
    name: codebaoku 

对应的 javabean:

@Component
@ConfigurationProperties(prefix = "student")
public class Student {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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

使用 @ConfigurationProperties 注解,需要配置一个prefix (前缀) 参数,即写上 key 就可以。另外 JavaBean 必须使用 @Component 注解,标记该注解的意思是要把该类交给 spring 管理,也就是说要让 spring 管理此类,也可以使用其他注解,例如 @Service。

 

5. 使用 @EnableConfigurationProperties 注解读取

使用 @EnableConfigurationProperties 注解与使用 @ConfigurationProperties 基本相同,但不需要 @Component 注解。

@EnableConfigurationProperties(prefix = "student")
public class Student {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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

 

6. 使用 @Autowired 注解和 Environment 对象读取

使用 Environment 对象,该对象是 spring 提供的一个对象,且是spring内部创建的对象。

website: 
  host: codebaoku

使用 @Autowired 和 Environment 对象,代码如下:

    @Autowired
    private Environment env

    @RequestMapping(value = "/website", method = RequestMethod.GET)
    public String website() {
        System.out.println(env.getProperty("website.host"));
        return env.getProperty("website.host");
    }
}	    

 

7. 使用 @PropertySource 注解读取 yml

我们除了可以读取 application.yml  文件的配置,也可以读取其它文件。例如:创建 test.yml 文件,并且与 application.yml 处于相同的目录。

我们可以 @PropertySource 注释指定特定文件:  

@PropertySource("classpath:test.yml")

然后可以使用上面的各种方法读取数据。