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

相关推荐
晨曦_子画3 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
假装我不帅23 分钟前
asp.net framework从webform开始创建mvc项目
后端·asp.net·mvc
南宫生25 分钟前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
神仙别闹26 分钟前
基于ASP.NET+SQL Server实现简单小说网站(包括PC版本和移动版本)
后端·asp.net
Heavydrink39 分钟前
HTTP动词与状态码
java
ktkiko1141 分钟前
Java中的远程方法调用——RPC详解
java·开发语言·rpc
计算机-秋大田1 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
神里大人1 小时前
idea、pycharm等软件的文件名红色怎么变绿色
java·pycharm·intellij-idea
货拉拉技术1 小时前
货拉拉-实时对账系统(算盘平台)
后端
小冉在学习1 小时前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论