SpringBoot用@ConfigurationProperties获取各类配置文件
测试代码
MyConfigurationProperties
项目为SpringBoot项目,在Postman中调/showValue
即可看到结果。本文中例子都是基于properties文件。
package com.example.configuration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ConfigurationProperties(prefix = "com.demo")
@Component
public class MyConfigurationProperties {
public String myString;
public int myInt;
public boolean myBoolean;
public char myChar;
public List<String> myList;
public Set<String> mySet;
public Map<String, String> myMap;
public Student student;
public List<Student> myStudentList;
public Set<Student> myStudentSet;
public Map<String, Student> myStudentMap;
// getter setter 省略
}
IndexController
:测试类
package com.example.configuration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
@Autowired
public MyConfigurationProperties myConfigurationProperties;
@RequestMapping("/showValue")
public MyConfigurationProperties showValue() {
return myConfigurationProperties;
}
}
Student
:一个简单实体类
package com.example.configuration;
public class Student {
public String name;
public int age;
public Boolean boy;
// getter setter 省略
}
测试结果
测试结果与下文对应
{
"myString": "Hello World",
"myInt": 2020,
"myBoolean": true,
"myChar": "t",
"myList": [
"list5",
"list4",
"list3",
"list2",
"list1",
"list1"
],
"mySet": [
"set1",
"set2",
"set3",
"set4",
"set5"
],
"myMap": {
"k1": "v1",
"k2": "v2",
"k3": "v3"
},
"student": {
"name": "Han Meimei",
"age": 18,
"boy": false
},
"myStudentList": [
{
"name": "LiLei",
"age": 20,
"boy": true
},
{
"name": "Han Meimei",
"age": 18,
"boy": false
}
],
"myStudentSet": [
{
"name": "LiLei",
"age": 20,
"boy": true
},
{
"name": "LiLei",
"age": 20,
"boy": true
},
{
"name": "Han Meimei",
"age": 20,
"boy": false
}
],
"myStudentMap": {
"boy": {
"name": "LiLei",
"age": 20,
"boy": true
},
"girl": {
"name": "Han Meimei",
"age": 18,
"boy": false
}
}
}
基本类型
com.demo.my-string=Hello World
com.demo.my-int=2020
com.demo.my-boolean=true
com.demo.my-char=t
String的List,Set,Map
com.demo.my-list=list5,list4,list3,list2,list1,list1
com.demo.my-set=set1,set2,set3,set4,set5,set5
com.demo.my-map.k1=v1
com.demo.my-map.k2=v2
com.demo.my-map.k3=v3
这里我看网上好多写法都是下面这样,个人观点除非value中有逗号否则真的没有必要
com.demo.my-list[0]=list0
com.demo.my-list[1]=list1
com.demo.my-set[0]=set0
com.demo.my-set[1]=set1
注意:Set
中如果有重复的值,只会保存一次,上面两种用法都是
一般实体类
com.demo.student.name=Han Meimei
com.demo.student.age=18
com.demo.student.boy=false
实体类的List,Set,Map
com.demo.my-student-list[0].name=LiLei
com.demo.my-student-list[0].age=20
com.demo.my-student-list[0].boy=true
com.demo.my-student-list[1].name=Han Meimei
com.demo.my-student-list[1].age=18
com.demo.my-student-list[1].boy=false
com.demo.my-student-set[0].name=LiLei
com.demo.my-student-set[0].age=20
com.demo.my-student-set[0].boy=true
com.demo.my-student-set[1].name=LiLei
com.demo.my-student-set[1].age=20
com.demo.my-student-set[1].boy=true
com.demo.my-student-set[2].name=Han Meimei
com.demo.my-student-set[2].age=20
com.demo.my-student-set[2].boy=false
com.demo.my-student-map.boy.name=LiLei
com.demo.my-student-map.boy.age=20
com.demo.my-student-map.boy.boy=true
com.demo.my-student-map.girl.name=Han Meimei
com.demo.my-student-map.girl.age=18
com.demo.my-student-map.girl.boy=false
注意:这里面set[0]
和set[1]
的实体类属性都是一样的, 但在上面的测试结果中,李雷还是返回了2次,这和String的Set是不一样的
总结
其实也没有什么好总结的,com.demo
是前缀,那么前缀之后紧接的一级key就是Java类中的变量名,再在代码中看这个变量的类型或者看之前的人怎么用的,很快就能知道用法了。
附:完整的properties文件
com.demo.my-string=Hello World
com.demo.my-int=2020
com.demo.my-boolean=true
com.demo.my-char=t
com.demo.my-list=list5,list4,list3,list2,list1,list1
com.demo.my-set=set1,set2,set3,set4,set5,set5
com.demo.my-map.k1=v1
com.demo.my-map.k2=v2
com.demo.my-map.k3=v3
com.demo.student.name=Han Meimei
com.demo.student.age=18
com.demo.student.boy=false
com.demo.my-student-list[0].name=LiLei
com.demo.my-student-list[0].age=20
com.demo.my-student-list[0].boy=true
com.demo.my-student-list[1].name=Han Meimei
com.demo.my-student-list[1].age=18
com.demo.my-student-list[1].boy=false
com.demo.my-student-set[0].name=LiLei
com.demo.my-student-set[0].age=20
com.demo.my-student-set[0].boy=true
com.demo.my-student-set[1].name=LiLei
com.demo.my-student-set[1].age=20
com.demo.my-student-set[1].boy=true
com.demo.my-student-set[2].name=Han Meimei
com.demo.my-student-set[2].age=20
com.demo.my-student-set[2].boy=false
com.demo.my-student-map.boy.name=LiLei
com.demo.my-student-map.boy.age=20
com.demo.my-student-map.boy.boy=true
com.demo.my-student-map.girl.name=Han Meimei
com.demo.my-student-map.girl.age=18
com.demo.my-student-map.girl.boy=false
附:完整的yaml文件
com:
demo:
my-boolean: true
my-char: t
my-int: 2020
my-list: list5,list4,list3,list2,list1,list1
my-map:
k1: v1
k2: v2
k3: v3
my-set: set1,set2,set3,set4,set5,set5
my-string: Hello World
my-student-list:
- age: 20
boy: true
name: LiLei
- age: 18
boy: false
name: Han Meimei
my-student-map:
boy:
age: 20
boy: true
name: LiLei
girl:
age: 18
boy: false
name: Han Meimei
my-student-set:
- age: 20
boy: true
name: LiLei
- age: 20
boy: true
name: LiLei
- age: 20
boy: false
name: Han Meimei
student:
age: 18
boy: false
name: Han Meimei
还是觉得properties文件比较好懂