一、核心定义与基础用法
1. @Value 注解
@Value 是 Spring 中用于零散地、直接地注入单个配置值的注解,支持 SpEL 表达式(Spring 表达式语言),通常作用在字段、方法参数或构造器参数上。
java
运行
@Component
public class ValueDemo {
// 注入单个配置值
@Value("${app.name}")
private String appName;
// 支持默认值
@Value("${app.port:8080}")
private Integer appPort;
// 支持SpEL表达式
@Value("#{T(java.lang.Math).random() * 100}")
private Double randomNum;
}
2. @ConfigurationProperties 注解
@ConfigurationProperties 是 Spring Boot 提供的注解,用于批量地、结构化地 绑定一组相关的配置属性到一个 Java 类中,通常作用在类上,需要配合 @Component(或 @Configuration)使类被 Spring 管理。
java
运行
@Component
// 绑定配置前缀为app的所有属性
@ConfigurationProperties(prefix = "app")
public class ConfigPropertiesDemo {
private String name;
private Integer port;
private List<String> allowedIps; // 支持复杂类型(集合、对象)
// 必须提供getter/setter方法(核心!)
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getPort() { return port; }
public void setPort(Integer port) { this.port = port; }
public List<String> getAllowedIps() { return allowedIps; }
public void setAllowedIps(List<String> allowedIps) { this.allowedIps = allowedIps; }
}
对应的 application.yml 配置:
yaml
app:
name: demo-app
port: 8081
allowed-ips: [127.0.0.1, 192.168.1.1]
二、核心对比(笔记核心)
| 对比维度 | @Value 注解 | @ConfigurationProperties 注解 |
|---|---|---|
| 绑定方式 | 单个属性零散绑定 | 批量结构化绑定(按前缀分组) |
| 支持的数据类型 | 基本类型、String、SpEL 表达式 | 基本类型、String、集合、对象(嵌套) |
| 是否需要 getter/setter | 不需要(直接注入字段) | 必须需要(通过 setter 绑定) |
| 默认值支持 | 支持(如 ${key:默认值}) |
不直接支持(需在类中手动设置默认值) |
| SpEL 表达式支持 | 支持 | 不支持 |
| 配置校验 | 不支持(无法用 @Validated 等校验) | 支持(配合 @Validated、@NotNull 等) |
| 松散绑定 | 不支持(必须严格匹配配置名,如 appName 不能写 app-name) | 支持(app-name 可绑定到 appName 字段) |
| IDE 提示 | 无(IDE 无法识别配置键是否存在) | 有(Spring Boot 插件可提示配置键) |
| 使用场景 | 少量、零散的配置注入 | 一组相关的配置(如数据源、第三方服务配置) |
三、实战示例:配置校验(@ConfigurationProperties 独有)
java
运行
@Component
@ConfigurationProperties(prefix = "app")
@Validated // 开启校验
public class ValidConfigDemo {
@NotNull(message = "应用名称不能为空") // 校验规则
private String name;
@Min(value = 1024, message = "端口号不能小于1024")
private Integer port;
// getter/setter省略
}
当配置中 app.name 为空时,启动项目会直接抛出校验异常,提前发现配置错误,这是 @Value 做不到的。
四、使用建议
- 如果只是注入 1-2 个零散的配置(如单个端口、单个开关),用
@Value更简洁; - 如果是一组相关的配置(如数据库配置:url、username、password),优先用
@ConfigurationProperties,可读性和可维护性更高; - 对配置有校验需求、需要 IDE 提示、或配置包含集合 / 对象类型时,必须用
@ConfigurationProperties; - 避免混合使用:同一组配置要么全用
@Value,要么全用@ConfigurationProperties,保持风格统一。
总结
@Value适合零散、简单、需 SpEL 的配置注入,无需 getter/setter,但不支持校验和松散绑定;@ConfigurationProperties适合批量、结构化、需校验 的配置注入,支持复杂类型和松散绑定,是 Spring Boot 中管理配置的最佳实践;- 核心选择依据:配置的 "关联性" 和 "复杂度"------ 零散简单用
@Value,成组复杂用@ConfigurationProperties。