SpringBoot配置文件的读取(包括list、map类型)

前言

添加配置文件处理器的依赖,这样在编写配置文件的时候就会有提示了。

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>

有了依赖,可以直接使用application.properties文件为我们工作了,这是Springboot的默认文件,它会通过其机制读取到上下文中,这样就可以引用它了

读取配置文件

在使用maven项目中,配置文件会放在resources根目录下。
我们的springBoot是用Maven搭建的,所以springBoot的默认配置文件和自定义的配置文件都放在此目录。
springBoot的 默认配置文件为 application.properties 或 application.yml,这里我们使用 application.properties

首先在application.properties中添加我们要读取的数据。

server.port = 8081

custom.name = lonewalker
custom.age = 18

第一种方式

我们可以通过@Value注解,这是Spring就有的,使用${...}占位符来读取配置在属性文件中的内容,既可以加在属性也可以加在方法上

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class User {

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

    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public Integer getAge() {
        return age;
    }

    @Value("${custom.age}")
    public void setAge(Integer age) {
        this.age = age;
    }
}

我们在测试环境试一下:

@SpringBootTest
class DemoApplicationTests {

    @Autowired
    User user;

    @Test
    void contextLoads() {
        System.out.println(user.getName());
        System.out.println(user.getAge());
    }

}

第二种方式:

如果有很多我们就要写很多@Value,就会很麻烦,于是就有第二种方式

通过注解@ConfigurationProperties(prefix="配置文件中的key的前缀")可以将配置文件中的配置自动与实体进行映射,默认从全局配置文件中获取值

@ConfigurationProperties("custom")这里的字符串custom会和类中的属性名称组成全限定名去配置文件中查找

@Component
@ConfigurationProperties(prefix = "custom")
public class User {

    private String name;

    private Integer age;

getter()... setter()...
}

扩展:

1、如何获取list数据

test.list=aaa,bbb,ccc

又该如何读取呢?

@SpringBootTest
class DemoApplicationTests {

    @Value("#{'${test.list:}'.empty ? null : '${test.list:}'.split(',')}")
    private List<String> testList;

    @Test
    void contextLoads() {
      if (testList == null){
          System.out.println("empty");
      }else{
          for (String list:testList
               ) {
              System.out.println(list);
          }
      }
    }

}

首先这是一个EL表达式,${test.list:} 是为它加上默认值但是这样有个问题,当不配置该 key 值,默认值会为空串,它的 length = 1,这样解析出来 list 的元素个数就不是空了

所以在此之前先判断一下是否为空,最终写成这样@Value("#{'${test.list:}'.empty ? null : '${test.list:}'.split(',')}") 就完美了,遍历的结果

2、如何获取map数据

test.map={name:"守约",force:"95"}