@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注解注入复杂类型的属性就介绍到这里吧,欢迎大家补充。

相关推荐
智慧老师1 分钟前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm3 分钟前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
V+zmm1013436 分钟前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
Oneforlove_twoforjob1 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
xmh-sxh-13141 小时前
常用的缓存技术都有哪些
java
搬码后生仔1 小时前
asp.net core webapi项目中 在生产环境中 进不去swagger
chrome·后端·asp.net
迷糊的『迷』1 小时前
vue-axios+springboot实现文件流下载
vue.js·spring boot
凡人的AI工具箱1 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite
AiFlutter1 小时前
Flutter-底部分享弹窗(showModalBottomSheet)
java·前端·flutter
J不A秃V头A2 小时前
IntelliJ IDEA中设置激活的profile
java·intellij-idea