配置绑定

十几个相关配置项用 @Value 逐个注入既啰嗦又难维护。@ConfigurationProperties 把一组配置绑定到一个类型安全的 Java 对象上,还支持校验与复用。

定义绑定类

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "app")
public class AppProperties {

    private String title = "未命名";
    private String baseUrl;
    private List<String> servers = new ArrayList<>();
    private Map<String, String> map = new HashMap<>();

    // getter / setter 省略(IDE 生成)
}

prefix = "app" 表示读取 app.* 下的所有配置项,字段名与配置 key 按宽松绑定对应:app.base-url 可以绑定到 baseUrl(kebab-case 写法最常用),环境变量等来源也遵循同一规则,完整对照表以官方文档为准。

推荐用不可变风格绑定:record 或「只有一个构造器 + final 字段」。Boot 3 起单个构造器会自动采用构造器绑定,无需额外注解(历史注解 @ConstructorBinding 已不再需要,以官方文档为准)。

启用绑定类

任选其一:

  • 主类加 @ConfigurationPropertiesScan,自动注册所在包下的绑定类;
  • @EnableConfigurationProperties(AppProperties.class) 显式注册;
  • 给绑定类加 @Component(不推荐,耦合了扫描机制)。

与 04 章配置对接

04 章里的 app.titleapp.serversapp.map 会自动填充到上面的对象:

@RestController
public class InfoController {

    private final AppProperties props;

    public InfoController(AppProperties props) {
        this.props = props;
    }

    @GetMapping("/app-info")
    public AppProperties info() {
        return props;   // 直接以 JSON 返回,方便检查绑定结果
    }
}

绑定校验

给类加 @Validated,字段上加 jakarta.validation 注解;嵌套对象属性要加 @Valid 才会递归校验:

@Validated
@ConfigurationProperties(prefix = "app")
public class AppProperties {

    @NotBlank
    private String title;

    @Size(max = 5)
    private List<String> servers = new ArrayList<>();
    // ...
}

校验失败会在启动阶段抛出异常、快速失败,避免带着错误配置上线。注意:类路径上需要存在 Bean Validation 实现(如 spring-boot-starter-validation,见 09 章)校验注解才会生效。

与 @Value 的取舍

场景推荐方式
单个配置项、临时取值@Value
一组相关配置、要类型与校验@ConfigurationProperties
配置项可能来自多环境需要合并覆盖@ConfigurationProperties(自动支持前缀下合并)

小结

绑定类把「魔法字符串配置」变成可读、可校验、可单测的普通对象,是配置管理的正解。后续 14–18 章的数据源、Redis 等连接配置,本质都是 Spring Boot 内部用同一机制绑定好的。

笔记加载中…