Spring Boot 读取自定义配置属性:@Value与@ConfigurationProperties详解
本文将深入解析Spring Boot中读取自定义属性配置的两种主要机制:@Value 和 @ConfigurationProperties。涵盖从单值注入到对象绑定、默认值处理、SpEL表达式支持及多文件加载的完整实操指南。
结果或目标
在Spring Boot应用中,我们需要灵活读取.properties或YAML配置文件中的键值对,以实现配置与代码分离。核心目标是掌握以下两种注入策略:
- 松散绑定(Loose Coupling):适用于少量、简单的配置项注入。
- 类型安全绑定(Type-safe Binding):适用于结构化的复杂配置组管理。
准备条件
假设项目中存在如下配置文件内容,我们需要读取lixl.person下的属性:
lixl:
person:
name: lixl
age: 20
真实操作顺序
第1步:使用 @Value 进行单值注入
目的:将单个配置项映射到类的字段、方法参数或构造器参数上。入口:Spring容器管理的Bean(需加@Component等注解)。
动作:
1. 定义一个类并使用@Component标注。
2. 在字段上使用@Value("${key}")注入。
@Component
public class Person {
@Value("${lixl.person.name}")
private String name;
@Value("${lixl.person.age}")
private String age;
@Override
public String toString() {
return "name:" + this.name + ";age:" + this.age;
}
// Getter and Setter methods...
}
观察到的完成状态:上述代码展示了最基础的字段注入。源码表明@Value不仅支持字段,还支持方法及构造器参数注入。
变体:在Setter方法中注入
如果需要在赋值前后执行额外逻辑,可注解于Setter方法:
@Value("${lixl.person.name}")
public void setName(String name) {
this.name = name;
}变体:在构造器中注入
在Spring Boot推荐的做法中,使用构造器注入可以更明确地表达依赖:
public Person(@Value("${lixl.person.name}")String name, @Value("${lixl.person.age}")String age) {
this.name = name;
this.age = age;
}进阶:设置默认值
当配置文件中缺失某个键时,可以使用冒号:设定默认值,防止启动报错:
// 若配置未提供name,则默认为"张三"
public Person(@Value("${lixl.person.name:张三}")String name, @Value("${lixl.person.age}")String age) { ... }
进阶:使用 SpEL 表达式
除了读取配置文件,@Value还可通过#{}包裹SpEL表达式进行运算或硬编码赋值。例如为性别字段直接赋固定值:
@Value("#{'男'}")
private String gender;
第2步:使用 @ConfigurationProperties 进行批量绑定
目的:将具有相同前缀的一组配置项自动映射为一个Java Bean。这种方式具有更强的类型安全性,且IDE能提供更好的智能提示。
入口:同@Value,同样需要组件化Bean。动作:
1. 定义目标Bean并标注@Component。
2. 使用@ConfigurationProperties(prefix = "xxx")指定前缀匹配规则。
假设有如下配置:
test.name='lixl' test.age=20 // 注意:建议写数字而非字符串以触发自动转换
编写对应的配置类:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "test")
public class ConfigTest {
private String name;
private Integer age; // 使用Integer而非String以展示类型绑定能力
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
}
第3步:自定义配置文件路径
如果配置信息不在默认的application.properties中,而是存放在独立文件中,可以通过@PropertySource显式加载:
使用注解:@PropertySource("classpath:my-config.properties")将该文件加入上下文环境变量中。
简要总结
@Value适合注入个别属性或表达式计算,语法简洁但不够类型安全;@ConfigurationProperties更适合结构化数据的“宽松绑定”,配合JSR-303校验可实现更严谨的配置管理。开发者可根据项目配置规模选择合适的方式。
以上就是Spring Boot如何读取自定义属性的详细内容,更多关于Spring Boot读取自定义属性的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









