【Spring Boot】配置文件YML:入门和使用

1.YML 配置文件概述

YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁,但描述数据的方式略微难于xml。
YML文件的扩展名可以使用.yml或者.yaml,虽然扩展名不同,但二者没有本质区别。

2.YML 配置文件的语法

  1. 配置普通数据(单个键值)

语法: key: value

示例:键与冒号之间没有空格,而值与空格间必须有一个英文半角空格

# 配置普通数据
name: chenfeilin

  1. 配置对象数据(对象中含有多个属性和对应值)

语法1
key:
​ key1: value1
​ key2: value2

示例:key1前面的空格个数不限定,在yml语法中,相同缩进代表同一个级别,但一般默认两个空格,缩进多度也影响阅读。

# 配置对象数据1
person:
  name: feilin
  age: 24

语法2
key: {key1: value1,key2: value2}

示例:

# 配置对象数据2
student: {
    
    name: stu,age: 77}

  1. 配置Map数据
    语法同上,上述数据结构既可以解析为对象,也可以解析为map集合。这里不再举例。

  2. 配置数组(List、Set)数据

语法1
key:
​ - value1
​ - value2

示例:value1与之间的 - 之间存在一个空格

# 配置数组(List、Set)数据1
mylist:
  - chenfeilin
  - 777
  - nagasawa_masami

语法2
key: [value1,value2]

示例:

# 配置数组(List、Set)数据2
city: [beijing,tianjin,shanghai,chongqing]

当集合中的元素为对象形式的时候:

# 集合中的元素是对象形式
users:
  - name: zhangsan
    age: 18
  - name: lisi
    age: 28
  - name: wangwu
    age: 38

3.注解 @Value 映射配置文件与配置类的属性

@Value 注解用于配置文件中单个键值的映射。
我们写一个controller,其中随便定义几个属性来接收配置文件中的值:

@RestController
public class TestController {
    
    

    @Value("${name}")
    private String name;

    @Value("${person.name}")
    private String personName;

    @RequestMapping(value = "/getValue")
    public String TestMapping() {
    
    

        System.out.println("name: " + name);
        System.out.println("personName: " + personName);

        return "request OK";
    }

}

启动工程访问 http://localhost:8080/getValue
在这里插入图片描述
访问成功,接下来看控制台:OK
在这里插入图片描述

4.注解 @ConfigurationProperties 配置映射

我们使用注解 @ConfigurationProperties可以完成配置文件中对象值到Java配置对象的映射

具体使用方法是通过注解@ConfigurationProperties(prefix=“配置文件中的key的前缀”)可以将配置文件中的配置自动与实体进行映射
例如配置文件中的person

person:
  name: feilin
  age: 24

下来看代码:

// 先提供一个载体,用来作为接收对象
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    
    

    private String name;
    private int age;

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

// 然后修改并获取到person
@RestController
public class TestController {
    
    

    @Value("${name}")
    private String name;

    @Autowired
    private Person person;

    @Value("${person.name}")
    private String personName;

    @RequestMapping(value = "/getValue")
    public String TestMapping() {
    
    

        System.out.println("name: " + name);
        System.out.println("person: " + person);
        System.out.println("personName: " + personName);

        return "request OK";
    }

}

控制台输出也没有问题:
在这里插入图片描述
需要注意的是,person类这里必须提供get和set方法,否则将无法获得配置文件中的值,此注解是通过set方法向对应的属性赋值的。而我们在使用@value 注解的情况下,是不用set方法也可以的。

我们可以再来配置一下其他的类型,例如集合,数组类型,我们修改一下配置文件:

person:
  name: feilin
  age: 24
  mylist:
    - chenfeilin
    - 777
    - nagasawa_masami
  address: [beijing,tianjin,shanghai,chongqing]
  girlFriends:
    - girlName: zhangsan
      girlAge: 18
    - girlName: lisi
      girlAge: 28
    - girlName: wangwu
      girlAge: 38

同时修改一下配置类,再添加一个类:

// 添加类gril
public class Girl {
    
    

    private String girlName;
    private int girlAge;

    public String getGirlName() {
    
    
        return girlName;
    }

    public void setGirlName(String girlName) {
    
    
        this.girlName = girlName;
    }

    public int getGirlAge() {
    
    
        return girlAge;
    }

    public void setGirlAge(int girlAge) {
    
    
        this.girlAge = girlAge;
    }

    @Override
    public String toString() {
    
    
        return "Girl{" +
                "girlName='" + girlName + '\'' +
                ", girlAge=" + girlAge +
                '}';
    }
}

// 修改配置类如下
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    
    

    private String name;
    private int age;
    private List<String> mylist;
    private String[] address;
    private Set<Girl> girlFriends;

    public String getName() {
    
    
        return name;
    }

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

    public int getAge() {
    
    
        return age;
    }

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

    public List<String> getMylist() {
    
    
        return mylist;
    }

    public void setMylist(List<String> mylist) {
    
    
        this.mylist = mylist;
    }

    public String[] getAddress() {
    
    
        return address;
    }

    public void setAddress(String[] address) {
    
    
        this.address = address;
    }

    public Set<Girl> getGirlFriends() {
    
    
        return girlFriends;
    }

    public void setGirlFriends(Set<Girl> girlFriends) {
    
    
        this.girlFriends = girlFriends;
    }

    @Override
    public String toString() {
    
    
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", mylist=" + mylist +
                ", address=" + Arrays.toString(address) +
                ", girlFriends=" + girlFriends +
                '}';
    }
}

最后控制台输出:

name: chenfeilin
person: Person{name=‘feilin’, age=24, mylist=[chenfeilin, 777, nagasawa_masami], address=[beijing, tianjin, shanghai, chongqing], girlFriends=[Girl{girlName=‘zhangsan’, girlAge=18}, Girl{girlName=‘lisi’, girlAge=28}, Girl{girlName=‘wangwu’, girlAge=38}]}
personName: feilin

如果你有多个yml配置文件的话,在和配置类映射时,可以通过注解 @PropertySource 来将其区分,
我们先随便创建一个配置文件,将person的内容拷贝过去,然后给person类加上注解
在这里插入图片描述
具体的使用实例如下:

@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value = {
    
    "classpath:abc.yml"}, factory = YamlPropertySourceFactory.class)
public class Person {
    
    ...}

// 这里需要注解里需要指定一个yaml的加载工厂类,我们可以自己去定义一个:
// 使用的是YamlPropertySourceLoader类的load方法
public class YamlPropertySourceFactory extends DefaultPropertySourceFactory {
    
    

    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
    
    
        if (resource == null) {
    
    
            return super.createPropertySource(name, resource);
        }
        List<PropertySource<?>> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
        return sources.get(0);
    }
}

/**
导的包如下:
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
*/

控制台输出结果不变:

person: Person{name=‘feilin’, age=24, mylist=[chenfeilin, 777, nagasawa_masami], address=[beijing, tianjin, shanghai, chongqing], girlFriends=[Girl{girlName=‘zhangsan’, girlAge=18}, Girl{girlName=‘lisi’, girlAge=28}, Girl{girlName=‘wangwu’, girlAge=38}]}

这里需要注意的一点是,注解 @PropertySource 在不指定factory属性的情况下肯定是是不会报错的,但是他将无法将我们yml配置文件中的值加载出来,这里不指定factory属性时应该是使用了默认的加载器,但其默认不支持加载yml文件,所以记得要加上这个yml文件加载工厂类。

5.SpringBoot配置信息的查询

SpringBoot的配置文件,主要的目的就是对默认的配置信息进行修改的,但是我们不可能完全记住所有配置的键值,在使用时可以去翻阅文档
这里提供了一个springboot【2.0.1.RELEASE】版本的官网配置文档:
文档URL:
https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/#common-application-properties

6.YML文件配置信息的代码提示

上边官网提供的配置信息的查询,是帮助我们将配置信息的认识从无到有的,当我们掌握和熟练使用一些配置信息后,肯定还是会不查资料,直接去写的,但是因为种种不可描述的原因,写错球咯,这时候需要一些提示功能帮我们找回记忆!

介绍这个内容的博客也有很多了,而且这个也不用写代码,没啥技术含量,就不重复造轮子了,附上一个之前看过的博客链接:
解决idea不支持SpringBoot yml文件
以及中文注释乱码问题:
spring boot application.yml文件中文注释乱码

补充
我用的idea版本可能比较新
在这里插入图片描述
里边使用到的插件可能和上边博客的不一致,这里附图

在这里插入图片描述

再补充
有时候你自己创建yml文件,或者使用其他插件创建yml文件的时候,例如JBLSpringBootAppGen插件,在你刚刚创建出文件时,会发现yml中无法提示,即使你在之前的项目中已经有了提示,此时可能也还是会没有提示,你需要将项目Rebuild之后再操作yml文件,此时提示才会生效。0.0
在这里插入图片描述

7.YML文件相互嵌套使用

当yml文件过长或想根据业务划分的话,可以用以下配置,引入拆分出去的子配置文件

嵌套单个:

spring:
  profiles:
    include:filename

嵌套多个:

spring:
  profiles:
    include:
      - filename1
      - filename2

子配置文件名为application-xxx.yml,例如嵌套单个时:application-filename.yml

8.SpringBoot配置多环境对应多个YML文件

附上链接:
1.springboot多环境配置文件,如何包含多个yml配置文件?看这一篇就够了
2.springboot配置多个yml文件
3.关于SpringBoot的application.yml的相关配置(自定义,开发,测试,正式)切换

猜你喜欢

转载自blog.csdn.net/cjl836735455/article/details/109370821