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>