Spring Boot中如何从properties文件注入数组类型配置值
在Spring Boot中注入数组/列表形式配置的方案
针对你这种带索引的嵌套配置,Spring Boot里最优雅的处理方式是用**@ConfigurationProperties**注解来完成配置绑定,下面我给你一步步拆解实现过程:
1. 定义对应的配置实体类
首先要创建和配置结构匹配的实体类,把配置里的层级映射成Java对象:
① 货币对实体类(CurPair)
用来映射market.curpairs[n]下的属性:
public class CurPair { private String name; private String symbol; private Double minamount; // 手动生成getter/setter,或者用Lombok的@Data注解一键搞定 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSymbol() { return symbol; } public void setSymbol(String symbol) { this.symbol = symbol; } public Double getMinamount() { return minamount; } public void setMinamount(Double minamount) { this.minamount = minamount; } }
② 货币实体类(Curr)
用来映射market.currs[n]下的属性:
public class Curr { private String name; private String symbol; private Double minamount; private Double withfee; // 同样需要getter/setter,用@Data更省心 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSymbol() { return symbol; } public void setSymbol(String symbol) { this.symbol = symbol; } public Double getMinamount() { return minamount; } public void setMinamount(Double minamount) { this.minamount = minamount; } public Double getWithfee() { return withfee; } public void setWithfee(Double withfee) { this.withfee = withfee; } }
③ 根配置实体类(MarketConfig)
这个类作为顶层绑定,对应配置里的market前缀,包含上面两个列表:
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.List; @Component @ConfigurationProperties(prefix = "market") public class MarketConfig { private List<CurPair> curpairs; private List<Curr> currs; // 生成getter和setter方法 public List<CurPair> getCurpairs() { return curpairs; } public void setCurpairs(List<CurPair> curpairs) { this.curpairs = curpairs; } public List<Curr> getCurrs() { return currs; } public void setCurrs(List<Curr> currs) { this.currs = currs; } }
2. 启用配置属性绑定
如果你的根配置类已经加了@Component,Spring Boot会自动扫描到它,但为了更规范,建议在主启动类上添加@EnableConfigurationProperties注解:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; @SpringBootApplication @EnableConfigurationProperties(MarketConfig.class) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
3. 注入并使用配置
现在你可以在任何Spring管理的Bean里(比如Service、Controller)注入MarketConfig,直接使用配置内容了:
import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class MarketService { @Resource private MarketConfig marketConfig; public void showMarketConfigs() { // 遍历输出所有货币对 marketConfig.getCurpairs().forEach(pair -> { System.out.printf("货币对:%s,符号:%s,最小交易金额:%f%n", pair.getName(), pair.getSymbol(), pair.getMinamount()); }); // 遍历输出所有货币配置 marketConfig.getCurrs().forEach(curr -> { System.out.printf("货币:%s,符号:%s,最小金额:%f,提现手续费:%f%n", curr.getName(), curr.getSymbol(), curr.getMinamount(), curr.getWithfee()); }); } }
额外小贴士
- 如果你的配置是单独的
config.properties而非默认的application.properties,需要在application.properties里添加spring.config.import=classpath:config.properties来导入这个配置文件。 - 推荐用Lombok的
@Data注解替代手动编写getter/setter,只需要在项目依赖里加入Lombok即可,能大幅减少样板代码。 - 配置里的索引
[0]、[1]是Spring Boot识别列表的规则,即使索引不连续(比如[0]和[2]),也会被正确映射为List的元素,不用担心顺序问题。
内容的提问来源于stack exchange,提问作者Gewure
相关产品推荐
相关产品推荐

