SpringBoot @Value 读取配置文件

1,093 阅读2分钟

@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