Skip to content

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。

基于 VitePress 重建