当前位置:网站首页>@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文件内容粘贴放入该文件中。
实体类加上对应路径:
测试后发现依然可以正常获取到值
边栏推荐
- go导入自建包
- Handsontable數據網格組件
- 数据探索电商平台用户行为流失分析
- 3dsmax plug-in development traversal node object and object acquisition and inode transformation matrix description
- C#生成putty格式的ppk文件(支持passphrase)
- Necessary tools for testing - postman practical tutorial
- laravel 事件 & 监听
- FL Studio20.9水果软件高级中文版电音编曲
- The latest CSDN salary increase technology stack in 2022 overview of APP automated testing
- Electron pit Addon
猜你喜欢
计算特殊奖金
数学知识:求组合数 III—求组合数
Neo4j installation, operation, project construction and function realization
Short message sending solution in medical his industry
Necessary tools for testing - postman practical tutorial
The latest CSDN salary increase technology stack in 2022 overview of APP automated testing
Log logrus third party library usage
工作6年,来盘点一下职场人混迹职场的黄金法则
【2022年】江西省研究生数学建模方案、代码
Qt5 mvc: revealing the secrets of data visualization
随机推荐
go导入自建包
思特奇加入openGauss开源社区,共同推动数据库产业生态发展
[Qt5 basics] random number display
Winodws 快速添加开机启动项
机器学习9-通用逼近器径向基函数神经网络,在新观点下审视PDA和SVM
What are the preferential activities for stock account opening? In addition, is it safe to open a mobile account?
Analysis on user behavior loss of data exploration e-commerce platform
PHP array splicing MySQL in statement
After working for 6 years, let's take stock of the golden rule of the workplace where workers mix up
[Office PDF] PDF merging and splitting will free us from the functional limitations of paid software, OK
KS009基于SSH实现宠物管理系统
Selenium经典面试题-多窗口切换解决方案
electron之坑addon
3dsmax plug-in development traversal node object and object acquisition and inode transformation matrix description
Int and bit group turn to each other
Upstream and downstream in software development
AS400 大厂面试
Leetcode 面试题 17.10. 主要元素
【agora】用户管理
如何学习和阅读代码