在后端的开发中,只要是使用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
注解注入复杂类型的属性就介绍到这里吧,欢迎大家补充。