Spring Boot中从Properties文件加载数据到指定HashMap的最优实现方案
嘿,刚好我之前处理过类似的配置绑定场景,给你分享下Spring Boot里把这种嵌套格式的Properties数据加载到你要的Map<String, Config>里的最优做法,其实就是利用Spring自带的配置绑定能力,步骤很清晰:
1. 完善你的Config实体类
首先得让Spring能识别Config类的属性,所以一定要给city和state加上getter和setter(或者用Lombok的@Data注解简化代码),这样Spring才能通过反射注入属性值:
public class Config { private String city; private String state; // 必须添加getter和setter,Spring依赖它们注入属性 public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } } // 如果你用Lombok的话,只需要这样写,省掉getter/setter // import lombok.Data; // @Data // public class Config { // private String city; // private String state; // }
2. 创建配置绑定类
接下来创建一个专门的配置类,用来接收整个Map<String, Config>集合,这里核心是用@ConfigurationProperties注解来实现自动绑定:
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Map; // 标记为Spring组件,让容器管理它 @Component // 开启配置绑定,Spring会自动匹配properties中的对应属性 @ConfigurationProperties public class AppConfigProperties { // 这个Map的key就是你要的us.10004251、ca.1212234,value是Config对象 private Map<String, Config> configurations; // 同样需要getter和setter(用Lombok的话可以省掉) public Map<String, Config> getConfigurations() { return configurations; } public void setConfigurations(Map<String, Config> configurations) { this.configurations = configurations; } }
3. 调整Properties文件的格式
注意哦,你的Properties文件需要稍微调整一下,要以配置类里的Map字段名configurations作为前缀,这样Spring才能正确把属性绑定到这个Map里:
# 格式:configurations.你的key.city=值 configurations.us.10004251.city=San Diego configurations.us.10004251.state=California configurations.ca.1212234.city=Toronto configurations.ca.1212234.state=Ontario
如果你的Properties是自定义文件(比如不是默认的application.properties),那还要在AppConfigProperties类上加上@PropertySource注解指定文件路径,比如:
@Component @ConfigurationProperties @PropertySource("classpath:custom-configs.properties") // 指定自定义配置文件路径 public class AppConfigProperties { // ... }
4. 开启配置绑定支持(可选但推荐)
在你的Spring Boot主启动类上加上@EnableConfigurationProperties注解,明确开启配置绑定功能,这样更规范:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; @SpringBootApplication // 开启指定配置类的绑定支持 @EnableConfigurationProperties(AppConfigProperties.class) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
5. 使用绑定好的Map
现在你就可以在任何需要的地方注入AppConfigProperties,直接拿到你要的Map了,比如在一个Controller里测试:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { private final AppConfigProperties appConfigProperties; // 构造方法注入(推荐的注入方式) @Autowired public TestController(AppConfigProperties appConfigProperties) { this.appConfigProperties = appConfigProperties; } @GetMapping("/test-config") public String getConfig() { // 拿到us.10004251对应的Config对象 Config sanDiegoConfig = appConfigProperties.getConfigurations().get("us.10004251"); return String.format("City: %s, State: %s", sanDiegoConfig.getCity(), sanDiegoConfig.getState()); } }
额外小技巧
- 如果不想用
@Component标记AppConfigProperties,也可以在@Configuration类里把它定义成一个Bean:
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean @ConfigurationProperties public AppConfigProperties appConfigProperties() { return new AppConfigProperties(); } }
这样AppConfigProperties就不需要加@Component了,灵活性更高。
备注:内容来源于stack exchange,提问作者Rivo

