SpringBoot学习_yaml介绍和yaml配置文件值获取

yaml简介

SpringBoot使用一个全局的配置文件,也就是下面这两个中的任意一个SpringBoot都会把它当做配置文件,配置文件名是固定的

  • application.properties
  • application.yml
    配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;

YAML(YAML Ain’t Markup Language)yaml和yml这两个后缀是一样的

  • YAML A Markup Language:是一个标记语言
  • YAML isn’t Markup Language:不是一个标记语言;

以前的配置文件;大多都使用的是 xxx.xml文件;

  • YAML:以数据为中心,比json、xml等更适合做配置文件;
  • YAML:配置server端口号例子,新建一个application.yml,放在resources文件夹下
server:
  port: 8082

yaml语法

基本语法

k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;空格多少无所谓,但是只要是左对齐的一列数据,都是同一个层级的
在这里插入图片描述
属性和值也是大小写敏感

值的写法

  • 字面量:普通的值(数字,字符串,布尔)
    k: v:字面直接来写;
    字符串默认不用加上单引号或者双引号;
    "":双引号不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
    name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
    '':单引号会转义特殊字符,特殊字符最终只是一个普通的字符串数据
    name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi

  • 对象、Map(属性和值)(键值对)
    k: v:在下一行来写对象的属性和值的关系;注意缩进
    比如有个friends对象,里面有两个属性name和age

friends:
  name: zhangsan
  age: 20

还有一种行内写法

friends: {name: zhangsan,age: 20}
  • 数组(List、Set)
    - 值(-+空格+值)表示数组中的一个元素
pets:
 ‐ cat
 ‐ dog
 ‐ pig

行内写法:

pets: [cat,dog,pig]

yml配置文件的值获取

获取方法一:用@ConfigurationProperties获取

@ConfigurationProperties的作用是告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
prefix = "Person"代表配置文件中Person下面的所有属性进行一一映射
@ConfigurationProperties默认从全局的配置文件中获取值
person类

package com.nyh.springboot.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author nyh
 * @create 2018-10-12  15:20
 **/

/*
* 将yml配置文件中配置的每一个值映射到这个javabean组件中
* @ConfigurationProperties的作用是告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
* prefix = "Person"代表配置文件中Person下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
* 所以要加上@Component注解
* */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    //
    private String lastName;
    //
    private Integer age;
    //
    private Boolean boss;
    //
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

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

    public Boolean getBoss() {
        return boss;
    }

    public void setBoss(Boolean boss) {
        this.boss = boss;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }
}

yml代码提示

写完后你会发现IDE中有个警告提示:
在这里插入图片描述
点击链接会跳转到官方文档中,让我们依赖一个配置文件处理器,作用是生成配置文件的一些元数据信息,有了它我们在配置文件中写代码就会有相应的提示了

<!--导入配置文件处理器,配置文件绑定就会有代码提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

导入完成后重新运行一下SpringBoot就可以了(就是重新运行主程序)
然后就会有提示了
在这里插入图片描述
last-namelastName其实是一样的
dog类:

package com.nyh.springboot.bean;

/**
 * @author nyh
 * @create 2018-10-13  8:23
 **/
public class Dog {
    //
    private String name;
    private Integer age;

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + 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;
    }
}

在yml中写对应的属性:
person要小写,别问我为什么知道…

person:
  lastName: nyh
  age: 20
  boss: false
  birth: 2018/09/09
  maps: {k1: v1,k2: v2}
  lists:
   - lisi
   - zhaoliu
  dog:
    name: 小白
    age: 2

在yml中写属性如果写对了的话会下面的导航会有提示的
在这里插入图片描述

相同的配置也可以写在 application.properties 中,随便你喜欢

person.last-name=张三
person.age=18
person.birth=2018/09/09
person.boss=false
person.maps.k1=v1
person.maps.k2=90
person.lists=a,b,c
person.dog.name=小白
person.dog.age=2

application.properties中文乱码问题

两种配置都可以用@ConfigurationProperties(prefix = "person")获取到的
application.properties时可能会出现中文乱码的问题,按照下图方式修改就可以了
在这里插入图片描述

SpringBoot的单元测试

在这里插入图片描述

第二种获取方法:@Value

在这里插入图片描述

@Value获取值和@ConfigurationProperties获取值比较

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

松散语法是指last-namelastName这种,代表的都一样的
SpEL是@Value("#{11*2}")这种
数据校验是指@Email这种
复杂类型是指map这种

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

猜你喜欢

转载自blog.csdn.net/qq_36901488/article/details/83027012