Spring Boot如何在单个类绑定多前缀@ConfigurationProperties配置
Spring Boot单类绑定多前缀配置实现
注意:你提供的yaml配置中
cache节点下的durtion存在拼写错误,需与Java类字段名保持一致为duration,否则配置无法完成绑定,修正后的配置如下:
storage: path: C:\\path\\example cache: duration: 60
最优实现方案
完全不需要使用@Value注解,也不需要拆分多个配置类、不需要手动写@Bean方法注册配置实例,直接利用@ConfigurationProperties的嵌套POJO自动绑定能力即可,单类即可承载所有一级节点的配置:
import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component // 不指定特定前缀,默认从配置根节点开始递归匹配绑定 @ConfigurationProperties public class GlobalConfig { // 字段名与yaml一级节点storage完全一致,自动绑定该节点下所有子属性 @Getter @Setter private Storage storage; // 字段名与yaml一级节点cache完全一致,自动绑定该节点下所有子属性 @Getter @Setter private Cache cache; // storage节点对应配置类 @Getter @Setter public static class Storage { private String path; } // cache节点对应配置类 @Getter @Setter public static class Cache { private Integer duration; } }
使用时直接注入GlobalConfig实例即可:
- 调用
globalConfig.getStorage().getPath()获取存储路径配置 - 调用
globalConfig.getCache().getDuration()获取缓存时长配置
你当前尝试的方案存在的问题
你写的@Configuration+内部类+@Bean注册的实现有两个明显问题:
- 仅绑定了
cache节点的配置,storage节点的配置完全没有被纳入,没有实现单类承载两组配置的需求 - 手动写
@Bean方法返回配置实例属于冗余代码,Spring Boot原生支持嵌套POJO的自动绑定,不需要手动注册配置对象
可选优化
如果需要IDE在编辑yaml配置时自动提示配置项、做类型校验,可以在嵌套类的字段上添加@NestedConfigurationProperty注解,该注解不影响实际绑定逻辑,仅用于生成Spring配置元数据。
内容的提问来源于stack exchange,提问作者Kre4
相关产品推荐
相关产品推荐

