You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中从Properties文件加载数据到指定HashMap的最优实现方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 10:23:02