spring boot 从application配置文件中读取变量
常见的application配置文件有yml,properties两种,本文会详细介绍两种配置文件的读取方法
环境信息:
- spring boot 2.1.8
- 依赖lombok (偷懒不写getter,setter)
properties类型配置文件
yml类型往下翻
配置文件信息:
test.name=wayne
test.age=3
一、读取简单变量
1.使用@Value注解
实体类:
@Data
@Component
public class Man {
@Value("${test.name}")
//如果想设置默认值可以用下面的写法
//@Value("${test.name:tom}") ==》当name读不到值时就会赋值tom
//@Value("tome") ==》 直接给name赋值tom
private String name;
@Value("${test.age}")
private String age;
}
测试类:
@Autowired
Man man;
@Test
public void contextLoads() {
System.out.println("Value");
System.out.println("man.name==>"+man.getName());
System.out.println("man.age==>"+man.getAge());
}
输出结果:
Value
man.name==>wayne
man.age==>3
2.使用Environment
可以直接通过Environment对象获取配置文件值
测试类:
@Autowired
Environment environment;
@Test
public void contextLoads() {
System.out.println("Environment");
System.out.println("man.name==>"+environment.getProperty("test.name"));
System.out.println("man.age==>"+environment.getProperty("test.age"));
}
测试结果:
Environment
man.name==>wayne
man.age==>3
3.使用@ConfigurationProperties注解
使用@ConfigurationProperties如果出现“Spring boot Configuration Annotation Processor....”错误,在pom.xml中添加一下依赖
org.springframework.boot
spring-boot-configuration-processor
true
实体类:
@Data
@Component
@ConfigurationProperties(prefix = "test")
//如果需要指定properties文件可以使用下面的注解(同理用于@Value)
//@PropertySource(value = "config.properties")
public class Man {
private String name;
private String age;
}
测试类:
@Autowired
Man man;
@Test
public void contextLoads() {
System.out.println("ConfigurationProperties");
System.out.println("man.name==>"+man.getName());
System.out.println("man.age==>"+man.getAge());
}
测试结果:
ConfigurationProperties
man.name==>wayne
man.age==>3
二、读取复杂类型
包括list、map
配置文件:
#map
#test为前缀、map为变量名、map之后到“=”都是key,“=”之后为value
test.map.name=wayne
test.map.age=3
test.map.gender=male
#list
#test为前缀、list为变量名
test.list[0]=0
test.list[1]=1
test.list[2]=2
实体类:
需要注意的是prefix 必须是完整的前缀,
@Data
@Component
@ConfigurationProperties(prefix = "test")
public class Man {
//变量名需要与配置文件中一样
private Map map=new HashMap<>();
private List list;
}
测试类:
@Autowired
Man man;
@Test
public void contextLoads() {
System.out.println("list、map");
System.out.println("man.map==>"+man.getMap());
System.out.println("man.list==>"+man.getList());
}
测试结果:
list、map
man.map==>{name=wayne, gender=male, age=3}
man.list==>[0, 1, 2]
yml类型配置文件
一、读取简单变量
yml配置文件读取简单变量的方式与上文properties的读取方式基本一致,不同的是配置文件的编写方式
配置文件:
#注意 “:”之后一定要空格
test:
name: wayne
age: 16
二、读取复杂变量
读取方式依旧相同,不同在yml的编写方式
配置文件:
# test为前缀
test:
#map 为变量名
map:
# key value格式
name: wayne
age: 16
height: 190
#list 为变量名,- 表示list中的各项
list:
- 1
- 2
- 3
- 4
#复合型 List
实体类:
@Data
@Component
@ConfigurationProperties("test")
public class Man {
private Map map=new HashMap<>();
private List list=new ArrayList<>();
private List
测试类:
@Autowired
Man man;
@Test
public void contextLoads() {
System.out.println("list、map");
System.out.println("man.map==>"+man.getMap());
System.out.println("man.list==>"+man.getList());
System.out.println("man.mapAndList==>"+man.getListAndMap());
}
测试结果:
list、map
man.map==>{name=wayne, age=16, height=190}
man.list==>[1, 2, 3, 4]
man.mapAndList==>[{name=tom, age=10}, {name=jack, age=9}, {name=zhangsan, age=8}]
参考
properties
- https://blog.csdn.net/dkbnull/article/details/81953190
- https://www.cnblogs.com/lgjlife/archive/2019/04/24/10762893.html
- https://blog.csdn.net/u014338530/article/details/86136986
yml
- https://www.cnblogs.com/mysgk/p/9790801.html