当前位置:网站首页>@ConfigurationProperties和@Value的区别
@ConfigurationProperties和@Value的区别
2022-07-01 01:46:00 【IT盛夏的果实】
目录
2 @ConfigurationProperties和@value的区别
1 前言
在平时开发中,我们会将大量的参数配置在application.properties或者application.yml文件中,通过@ConfigurationProperties注解或者@value注解可以很方便的拿到这些值。
2 @ConfigurationProperties和@value的区别
两种注解斗能够读取配置文件中属性并绑定到javaBean中,但两种存在以下不同
1)使用位置不同
@ConfigurationProperties:标注在JavaBean的类名上;
@Value:标注在JavaBean的属性上。
2)功能
@ConfigurationProperties:用于批量绑定配置文件中的配置;
@Value:只能一个一个的指定需要绑定的位置,绑定粒度更小
3)松散绑定支持不同
@ConfigurationProperties:支持松散绑定,例如实体类Person中有一个属性为username,那么配置文件中的属性名支持以下写法:person.username、person_name、person.user_name、PERSON_USER_NAME
@Value:不支持松散绑定
4) 复杂类型封装
@ConfigurationProperties:支持所有类型的封装,例如Map、List、Set以及对象等
@Value:只支持基本数据类型的封装,例如:字符串、布尔值、整数等类型
5)应用场景不同,两者并没有明显的优劣势之分,它们只适合应用的场景不同。若只是获取配置文件中的某项值,则推荐使用@Value注解;若专门编写了一个JavaBean来和配置文件进行映射,则建议使用@ConfigurationProperties注解。
3 用法
3.1 @ConfigurationProperties
实体类:
package com.liubujun.springdataelasticsearch.entity;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @Author: liubujun
* @Date: 2022/6/30 13:57
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String username;
private Integer age;
private String address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Person{" +
"username='" + username + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
配置文件:
person.username=Tony老师
person.age=21
person.address=地球村测试类:
@Autowired
private Person person;
@Test
public void test(){
System.out.println("姓名:"+person.getUsername()+"、年龄:"+person.getAge()+"、地址:"+person.getAddress());
}运行结果:

从运行结果中可发现我们能够成功的从配置文件中获取相关值。
注意:@ConfigurationProperties支持松散绑定
配置文件改成:
person.user_name=Tony老师
person.age=21
person.address=地球村测试发现依然正常获取到值:

注意: @ConfigurationProperties支持复杂类型封装
配置文件改成:
person.user_name=Tony老师
person.age=21
person.address=地球村
person.email[0][email protected]
person.email[1][email protected]
person.email[2][email protected]实体类加个字段对应修改:
@Component
@ConfigurationProperties(value = "person")
public class Person {
private String username;
private Integer age;
private String address;
private List<String> email;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<String> getEmail() {
return email;
}
public void setEmail(List<String> email) {
this.email = email;
}
@Override
public String toString() {
return "Person{" +
"username='" + username + '\'' +
", age=" + age +
", address='" + address + '\'' +
", email=" + email +
'}';
}
}
测试类:
@Autowired
private Person person;
@Test
public void test(){
System.out.println("姓名:"+person.getUsername()+"、年龄:"+person.getAge()+"、地址:"+person.getAddress()+"、email:"+person.getEmail());
}
结果:

3.2 @Value
实体类如下:其它配置不变
@Component
public class Person {
@Value("${person_username}")
private String username;
@Value("${person.age}")
private Integer age;
@Value("${person.address}")
private String address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Person{" +
"username='" + username + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
测试正常输出:

注意:@Value不能够支持松散绑定,如果将配置文件改成如下:
person.user_name=Tony老师
person.age=21
person.address=地球村测试发现获取不到“username”的值,报错信息如下:
Error creating bean with name 'person': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'person_username' in value "${person_username}"注意:@Value不支持复杂类型封装,将实体类增加一个List类型的字段
@Component
public class Person {
@Value("${person.username}")
private String username;
@Value("${person.age}")
private Integer age;
@Value("${person.address}")
private String address;
@Value("${person.email}")
private List<String> email;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<String> getEmail() {
return email;
}
public void setEmail(List<String> email) {
this.email = email;
}
@Override
public String toString() {
return "Person{" +
"username='" + username + '\'' +
", age=" + age +
", address='" + address + '\'' +
", email=" + email +
'}';
}
}配置文件修改如下:
person.user_name=Tony老师
person.age=21
person.address=地球村
person.email[0][email protected]
person.email[1][email protected]
person.email[2][email protected]测试类:
@Autowired
private Person person;
@Test
public void test(){
System.out.println("姓名:"+person.getUsername()+"、年龄:"+person.getAge()+"、地址:"+person.getAddress()+"、email:"+person.getEmail());
}
运行之后发现报错:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'person': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'person.email' in value "${person.email}"但是要是获取其中一个值就不会有问题:

运行结果:

4 指定配置文件
在实际开发中,有大量内容需要配置管理,不可能将所有的信息放到同一个配置文件中,这样既不安全也不方便维护,我们可以将SpringBoot无关的配置单独放入其他的配置文件,在需要这些JavaBean上使用即可,SpringBoot提供了@PropertySource注解。
新建一个文件:

将之前application.properties文件内容粘贴放入该文件中。
实体类加上对应路径:
测试后发现依然可以正常获取到值

边栏推荐
- Sun Yuchen told Swiss media Bilan that the bear market will not last long
- 【agora】用户管理
- Upstream and downstream in software development
- QML控件类型:ToolTip
- electron之坑addon
- In the fourth week of June, the list - flying melon data up main growth ranking list (BiliBili platform) was released!
- QML control type: tooltip
- [proteus simulation] Arduino UNO +74c922 keyboard decoding drive 4x4 matrix keyboard
- Neo4j installation, operation, project construction and function realization
- 求两个线段公共部分的长度
猜你喜欢

What are the applications of SMS in enterprises?

7-2 拼题A打卡奖励 dp

QML control type: tooltip

In the fourth week of June, the list - flying melon data up main growth ranking list (BiliBili platform) was released!

CorelDRAW 2022中文精简64位直装版下载

Compile and install oh my Zsh

思特奇加入openGauss开源社区,共同推动数据库产业生态发展

7-2 punch in reward DP for puzzle a

electron之坑addon

How to maintain efficient collaboration in remote office and achieve stable growth of projects | community essay solicitation
随机推荐
测试必备工具—Postman实战教程
PHP converts two-dimensional array elements into key value pairs
数据探索电商平台用户行为流失分析
【2022年】江西省研究生数学建模方案、代码
laravel+redis 生成订单号-当天从1开始自增
electron之坑addon
软件开发中的上游和下游
正向代理和反向代理快速理解
3500字归纳总结:一名合格的软件测试工程师需要掌握的技能大全
The whole process of AS400 API from zero to one
亲测有效,快速创建JMeter桌面快捷方式
522. 最长的特殊序列 II
如何学习和阅读代码
[Qt5 basics] random number display
小程序云开发之--微信公众号文章采集篇
CorelDRAW 2022 Chinese Simplified 64 bit direct download
7-2 拼题A打卡奖励 dp
Factory + strategy mode
Handsontable数据网格组件
CorelDRAW 2022中文精简64位直装版下载