@Value和@ConfigurationProperties注入集合、Map、数组属性值

在后端的开发中,只要是使用spring或者springboot,那么基本上就离不开@Value@ConfigurationProperties这两个注解,他们都是用来给我们属性赋值的,@Value 是给单个属性赋值,@ConfigurationProperties 是给多个属性赋值。简单的属性赋值就不说了,今天来看下,对于数组,集合,Map类型的属性,该要如何赋值。

1. @Value 注入数组

java 复制代码
@Component  
public class Person {  
  
    @Value("${person.hobbies}")  
    private String[] hobbies;  
}

配置文件:

yaml 复制代码
person:
  #注意:要用逗号分隔,如果用其他符号分隔就会被识别为一个元素。
  hobbies: basketball,football,swimming  #注意:在nacos配置时逗号前后不要有空格

2. @Value 注入集合

java 复制代码
@Component  
public class Person {  
 
    @Value("${person.hobbies}")  
    private Collection<String> hobbies;   
}

配置文件:

yaml 复制代码
#和数组的写法一样,同样也要用逗号分隔。如果用其他分隔符,可以借助SPEL来解析
person:  
  hobbies: basketball,football,swimming,signing
  

#这种写法@Value不能解析,@ConfigurationProperties注解可以
person:  
  hobbies:  
    - basketball  
    - football  
    - swimming

如果将分隔符换成#,那么需要借助SPEL来解析成数组或者集合。

java 复制代码
@Component  
public class Person {  
  
    @Value("#{'${person.hobbies}'.split('#')}")  
    private String[] hobbies2;  

    @Value("#{'${person.hobbies}'.split('#')}")  
    private Collection<String> hobbies;
}

3. @Value 注入Map

java 复制代码
@Component  
public class Person {  
  
    //借助SPEL表达式
    @Value("#{${person.courses}}")  
    Map<String, String> courses;
}

配置文件:

yaml 复制代码
person:
  #JSON写法
  courses: "{english: 'A', math: 'B', physics: '不合格'}"
  
#这种格式@Value无法解析,@ConfigurationProperties注解可以
person:  
  courses:  
    english: 'A'  
    math: 'B'  
    physics: '不合格'  

顺便提一下,@Value 注入如果找不到对应的配置,则会报错,如果不想报错,可以给一个默认值,用:分隔。

java 复制代码
  //默认值是zhangsan
  @Value("${person.name:zhangsan}")
  private String name;
  
  //默认值是空串""
  @Value("${person.name:}")
  private String name;

4. @ConfigurationProperties注入数组

java 复制代码
@Data  
@ConfigurationProperties(prefix = "person")  
@Component  
public class Person {  
  
  private String[] nickNames;
}

配置文件:

yaml 复制代码
person:  
  nick-names:  #用nickeNames也可以,支持松散绑定
    - 阿呆  
    - 吴彦祖
    
#还可以行内写法:
person:  
  nick-names: [阿呆,彦祖,冠希]

5. @ConfigurationProperties注入集合

和注入数组是一模一样的。

6. @ConfigurationProperties注入Map

java 复制代码
@Data  
@ConfigurationProperties(prefix = "person")  
@Component  
public class Person {  
 
   private Map<String, String> courses;
}

配置文件:

yaml 复制代码
person:  
  courses:  
    english: '及格'  
    math: '优秀'  
    chinese: '满分'
    
    
#还可以行内写法
person: 
  #@Value注入Map时和这个很像,但是@Value需要用引号括起来,但是这里不能括起来
  courses: { english: 及格, math: 优秀, chinese: 满分2 }

汇总一下:

java 复制代码
@Data  
@ConfigurationProperties(prefix = "person")  
@Component  
public class Person implements InitializingBean {  
  
    //数组  
    private String[] nickNames;  

    //集合  
    private Collection<String> hobbies;  

    //Map  
    private Map<String, String> courses;  

    //其他类  
    private Car car;  

    @Override  
    public void afterPropertiesSet() throws Exception {  
        System.out.println("nickNames = " + Arrays.toString(nickNames));  
        System.out.println("hobbies = " + hobbies);  
        System.out.println("courses = " + courses);  
        System.out.println("car = " + car);  
    }  
}

配置文件:

yaml 复制代码
person:  
  nick-names:  
    - 阿呆  
    - 吴彦祖  
  hobbies: [basketball, football, swimming]  
  courses:  
    english: '及格'  
    math: '优秀'  
    chinese: '满分'  
  car:  
    brand: 奥迪  
    price: 300000.00

简单看下@Value@ConfigurationProperties注解的区别

@ConfigurationProperties @Value
特点 批量注入配置文件中的属性 单个指定
SPEL功能 不支持 支持
松散绑定 支持 不支持
复杂类型封装 支持 不支持
JSR303校验 支持 不支持

好了,关于@Value@ConfigurationProperties注解注入复杂类型的属性就介绍到这里吧,欢迎大家补充。

相关推荐
卡布奇诺-海晨40 分钟前
2025版本的idea解决Git冲突
java·git·intellij-idea
Flash Dog41 分钟前
【MyBatis】——执行过程
java·mybatis
Li_76953243 分钟前
2025.2.X 版本 IDEA maven 打包乱码问题的解决
java·maven·intellij-idea
DKPT2 小时前
JVM栈溢出和堆溢出哪个先满?
java·开发语言·jvm·笔记·学习
m0_475064502 小时前
jvm双亲委派的含义
java·jvm
海梨花2 小时前
今日八股——JVM篇
jvm·后端·面试
毕设源码-朱学姐6 小时前
【开题答辩全过程】以 爱心捐赠网站为例,包含答辩的问题和答案
java·eclipse
Pr Young6 小时前
服务优雅停止和服务优雅启动
后端
嘟嘟MD8 小时前
程序员副业 | 2025年9月复盘
后端·aigc
尘觉8 小时前
中秋节与 Spring Boot 的思考:一场开箱即用的团圆盛宴
java·spring boot·后端