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

相关推荐
兩尛11 小时前
Spring面试
java·spring·面试
舒一笑11 小时前
🚀 PandaCoder 2.0.0 - ES DSL Monitor & SQL Monitor 震撼发布!
后端·ai编程·intellij idea
Java中文社群11 小时前
服务器被攻击!原因竟然是他?真没想到...
java·后端
Full Stack Developme11 小时前
java.nio 包详解
java·python·nio
零千叶11 小时前
【面试】Java JVM 调优面试手册
java·开发语言·jvm
代码充电宝12 小时前
LeetCode 算法题【简单】290. 单词规律
java·算法·leetcode·职场和发展·哈希表
li37149089012 小时前
nginx报400bad request 请求头过大异常处理
java·运维·nginx
摇滚侠12 小时前
Spring Boot 项目, idea 控制台日志设置彩色
java·spring boot·intellij-idea
helloworddm12 小时前
Orleans 流系统握手机制时序图
后端·c#
Aevget12 小时前
「Java EE开发指南」用MyEclipse开发的EJB开发工具(二)
java·ide·java-ee·eclipse·myeclipse