SpringBoot获取核心配置文件中自定义的属性数据

前提:之前的文章有介绍SpringBoot获取自定义配置属性数据的方法,一个是使用@Value注解,另一个是使用@ConfigurationProperties结合@Component注解,但是我后来还遇到一个获取配置数据的方法,这次又写一篇,扩展了配置数据的类型。

一、在核心配置文件application.yml中自定义属性(属性类型可以是对象、数组或纯量)


name: abc

# 对象(包含数组)
person:
  name: ${name} #libai
  age: 20
  adress:
    - beijing
    - shanghai

# 对象行内写法
person2: {name: libai, age: 25}

# 数组
adress:
  - beijing
  - shanghai

# 数组行内写法
adress2: [beijing, shanghai]

# 纯量
msg1: 'hello \n world' #不会识别转义符,会原样输出

msg2: "hello \n world" #会识别转义符

二、定义测试类(我这里就用Controller进行测试)

package com.winson.fastbuildproject;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @description:获取配置数据
 * @date: 2020/10/3 20:19
 * @author: winson
 */
@RestController
public class HelloController {

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

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

    @Value("${person.age}")
    private int age;

    @Value("${adress[0]}")
    private String adress1;

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

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


    @Autowired
    private Environment env;

    @Autowired
    private Person person;

    @RequestMapping("/")
    public String hello() {
        System.out.println(name);
        System.out.println(name2);
        System.out.println(age);
        System.out.println(adress1);
        System.out.println(msg1);
        System.out.println(msg2);

        System.out.println("------------------使用Environment获取配置-------------------");
        System.out.println(env.getProperty("name"));
        System.out.println(env.getProperty("person.name"));
        System.out.println(env.getProperty("adress[0]"));

        System.out.println("------------------使用@ConfigurationProperties获取配置-------------------");
        System.out.println(person.toString());
        String[] adress = person.getAdress();
        for (String s : adress) {
            System.out.println(s);
        }
        return "hello controller";
    }

}

三、定义自定义属性的对应配置类

package com.winson.fastbuildproject;

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

/**
 * @description:
 * @date: 2020/10/3 20:51
 * @author: winson
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String name;

    private int age;

    private String[] adress;

    public String[] getAdress() {
        return adress;
    }

    public void setAdress(String[] adress) {
        this.adress = adress;
    }

    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;
    }

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

四、控制台打印结果

补充:我用IDEA做的测试,使用@ConfigurationProperties注解的使用,应该在pom.xml中再添加一个依赖(否则页面会一直有提示),如下,这样,如果你先定义了实体类,然后在核心配置文件中,定义属性,会自带提示,如果SpringBoot自带的属性(server.port)会给提示一样,所以我建议大家加上这个依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
posted @ 2020-10-03 21:15  温森  阅读(654)  评论(0编辑  收藏  举报