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

相关推荐
星辰离彬几秒前
Java 与 MySQL 性能优化:Java应用中MySQL慢SQL诊断与优化实战
java·后端·sql·mysql·性能优化
GetcharZp1 小时前
彻底告别数据焦虑!这款开源神器 RustDesk,让你自建一个比向日葵、ToDesk 更安全的远程桌面
后端·rust
程序猿小D2 小时前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的个人财务管理系统,推荐!
java·数据库·mysql·spring·毕业论文·ssm框架·个人财务管理系统
jack_yin2 小时前
Telegram DeepSeek Bot 管理平台 发布啦!
后端
小码编匠2 小时前
C# 上位机开发怎么学?给自动化工程师的建议
后端·c#·.net
库森学长2 小时前
面试官:发生OOM后,JVM还能运行吗?
jvm·后端·面试
转转技术团队2 小时前
二奢仓店的静默打印代理实现
java·后端
蓝易云2 小时前
CentOS 7上安装X virtual framebuffer (Xvfb) 的步骤以及如何解决无X服务器的问题
前端·后端·centos
钢铁男儿3 小时前
C# 接口(什么是接口)
java·数据库·c#
丶小鱼丶3 小时前
排序算法之【归并排序】
java·排序算法