SpringBoot中@Value如何注入List、Set、Map结构数据

在SpringBoot中,我们可以使用@Value注解快速的进行配置的注入,在使用时,我们一般使用${…}的形式,但有时候也能见到#{…},他俩有啥区别呢?

#{…}和${…}的区别

  • ${…} 用于加载外部属性文件中的值
  • #{…} 用于执行SpEL表达式,并将内容赋值给属性
  • #{…}${…} 可以混合使用,但是必须#{}外面,${}在里面。(很好理解,要先用$将值取到之后才有数据可以执行SpEL表达式对数据进行操作)

实际使用代码

    //====注入单值====
    /**
     * 未配置会报错
     * Could not resolve placeholder 'string' in value "{${string}}"
     */
//    @Value("${string}")
//    private String string;

    /**
     * 带默认值,默认值为:空字符串
     */
    @Value("${string:}")
    private String string1;

    /**
     * 带默认值,默认值为:abc
     */
    @Value("${string:abc}")
    private String string2;

    //====注入List====
    /**
     * 带默认值,默认值为:空
     */
    @Value("#{'${list:,}'.split(',')}")
    private List<String> list;

    /**
     * 错误样例:记得冒号后面带,否则得到的结果是个长度为1的list,可以对比看效果
     */
    @Value("#{'${list:}'.split(',')}")
    private List<String> list1;

    /**
     * 带默认值,默认值为:a,b,c
     */
    @Value("#{'${list:a,b,c}'.split(',')}")
    private List<String> list2;

    //====注入Set====
    /**
     * 带默认值,默认值为:空
     */
    @Value("#{'${set:,}'.split(',')}")
    private Set<String> set;

    //====注入Map====
    /**
     * 带默认值,默认值为:null
     */
    @Value("#{${map:{}}}")
    private Map<String, String> map;

    /**
     * 带默认值,默认值为:{"k1":"v1","k2":"v2"}
     */
    @Value("#{${map:{k1:'v1',k2:'v2'}}}")
    private Map<String, String> map1;

注入效果


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍