P66 三分钟搞懂 SpringBoot 配置:@Value 配置类 Environment 怎么选
面试题:读取 SpringBoot 配置有哪几种方式?@Value、@ConfigurationProperties、Environment 怎么选?
1. 三种方式
① @Value 读单个值
java
@Value("${app.name:defaultName}")
private String appName;
@Value("${app.timeout:3000}")
private int timeout;- 适合:少量单个配置;
- 支持默认值、SPEL;
- 缺点:分散在各个类里,不好管理;类型转换弱。
② @ConfigurationProperties 绑定配置类(推荐)
java
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String name;
private int timeout;
private List<String> servers;
// getter/setter
}对应 yml:
yaml
app:
name: demo
timeout: 3000
servers:
- a.com
- b.com- 适合:一组相关配置(数据库、Redis、自定义业务配置);
- 强类型绑定(自动转 List/Map/对象)、集中管理、配置提示(spring-boot-configuration-processor);
- 配合
@Validated可以做参数校验。
③ Environment 动态读取
java
@Autowired
private Environment env;
String name = env.getProperty("app.name");- 适合:运行时动态获取、不方便注入的场景;
- 能拿到的配置来源更多(系统属性、环境变量、配置文件全部合并视图)。
2. 怎么选(速记)
| 场景 | 选谁 |
|---|---|
| 单个散配置 | @Value |
| 一组业务配置 | @ConfigurationProperties |
| 运行时动态取值/切换环境 | Environment |
3. 加分点
- 提到 @Value 无法用 @ConfigurationProperties 的松散绑定(
app-name↔appName); - 提到配置来源优先级:命令行 > Java 系统属性 > 环境变量 > application.yml > 默认值;
- 提到
@ConfigurationProperties配合@RefreshScope(Spring Cloud)实现配置热更新。
一句话总结
读单个值用 @Value,一组相关配置用 @ConfigurationProperties(强类型、集中管理),运行时动态取值用 Environment;配置多时优先 ConfigurationProperties,别满项目撒 @Value。