@Value读取配置文件yml中的数据list、map、string
接下来用一个简单地示例来讲解:
- application.yml配置文件
server:
port: 8096
# list
list1: a,b,c
# set
set1: a,b,c,a,b
# map
# 对于map整体要用引号进行包裹,对于value值必须要包裹,key值可以不包裹
map1: '{"name":"gavin","age":"18"}'
# map1: '{name:"gavin",age:"19"}'
- ListConfig配置类
@Configuration
@Data
public class ListConfig {
@Value("#{'${list1}'.split(',')}")
private List<String> list1;
/**
*冒号后表示默认值,此处表示yml文件没有配置list2时,默认list2为空,此处返回list2=[]
*/
@Value("#{'${list2:}'.split(',')}")
private List<String> list2;
/**
*冒号后表示默认值,此处表示yml文件没有配置list2时,默认list2为空,
* 若list2位空,则返回list3=null,否则正常返回
*/
@Value("#{'${list2:}'.empty ? null:'${list2:}'.split(',')}")
private List<String> list3;
/**
*冒号后表示默认值,此处表示yml文件没有配置list4时,默认list4为g,此处返回list4=[g]
*/
@Value("#{'${list2:g}'.split(',')}")
private List<String> list4;
/**
*冒号后表示默认值,此处表示yml文件没有配置address时,默认address为asd,此处返回address=asd
*/
@Value("${address:asd}")
private String address;
/**
*set与list原理一致,只是对结果进行了去重操作,此处返回set1=[a, b, c]
*/
@Value("#{'${set1}'.split(',')}")
private Set<String> set1;
@Value("#{${map1}}")
private Map<String,String> map1;
}
- controller 测试文件
RestController
@RequestMapping("/hello")
public class controller {
@Autowired
private ListConfig listConfig;
@GetMapping("/test1")
public void test() {
List<String> test=listConfig.getList1();
System.out.println("list1: "+test); //list1: [a, b, c]
}
@GetMapping("/test2")
public void test2() {
List<String> test=listConfig.getList2();
System.out.println("list2: "+test); //list2: []
}
@GetMapping("/test3")
public void test3() {
List<String> test=listConfig.getList3();
System.out.println("list3: "+test); // list3: null
}
@GetMapping("/test4")
public void test4() {
List<String> test=listConfig.getList4();
System.out.println("list4: "+test); // list4: [g]
}
@GetMapping("/test5")
public void test5() {
String test=listConfig.getAddress();
System.out.println("address: "+test); // address: asd
}
@GetMapping("/test6")
public void test6() {
Set<String> test=listConfig.getSet1();
System.out.println("set1: "+test); // set1: [a, b, c]
}
// key = name, value = gavin
// key = age, value = 18
@GetMapping("/test7")
public void test7() {
Map<String,String> map=listConfig.getMap1();
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue());
}
}
}
yml中单引号和双引号的区别
"":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
information1: "gavin \n 年龄18"
输出
information1: gavin
年龄18
'':单引号;会转义特殊字符,特殊字符终只是一个普通的字符串数据
information2: 'gavin \n 年龄18'
输出
information2: gavin \n 年龄18