Spring初始化 Map 和 解析Json value
单独定义Map数据结构的bean:
<bean id= "expToLevelMap" class="org.springframework.beans.factory.config.MapFactoryBean" > <property name ="sourceMap"> <map> <entry key ="expToLevel"> <value> <![CDATA[ [{id:0, "name":"江湖小虾","level":0,"exp":0}, {id:1, "name":"江湖小虾","level":1,"exp":6}, {id:2, "name":"江湖小虾","level":2,"exp":16}, {id:3, "name":"江湖小虾","level":3,"exp":40}, {id:4, "name":"江湖小虾","level":4,"exp":70}, {id:5, "name":"江湖小虾","level":5,"exp":110}, {id:6, "name":"江湖小虾","level":6,"exp":190}, {id:7, "name":"江湖小虾","level":7,"exp":310}, {id:8, "name":"江湖小虾","level":8,"exp":470}, {id:9, "name":"江湖小虾","level":9,"exp":670}, {id:10, "name":"江湖小虾","level":10,"exp":790} ] ]]> </value> </entry> </map> </property> </bean >
property可以定义很多个,这样的方式,用spring配置就可以重用这个map里的值了。
value是一个json数组,数组中是一个exp值和level的对应关系的结构。那么我们在spring启动的时候就解析这个value,把它转成java中Object,提供给其他组件使用。
接下来要做的是解析这个value到jsonArray,再解析到object TreeMap。
所以我们在初始化bean容器的时候就进行解析:
这里使用 @PostConstruct
@Service("expToLevelService" ) public class ExpToLevelServiceImpl { @Resource private Map<String , String> expToLevelMap; private TreeMap<Long , ExpToLevelObj> expToLevelTreeMap; @PostConstruct public void init () { expToLevelTreeMap = new TreeMap<Long , ExpToLevelObj>(); JSONArray array = JSONArray.parseArray (expToLevelMap. get("expToLevel" )); for ( Object object : array) { JSONObject jsonObj = (JSONObject) JSONObject.parse (object. toString()); ExpToLevelObj obj = new ExpToLevelObj(jsonObj .getIntValue( "id"), jsonObj.getIntValue ("exp") , jsonObj.getIntValue ("level") , jsonObj .getString( "name")); expToLevelTreeMap.put (jsonObj. getLongValue("exp" ), obj); } } public TreeMap<Long , ExpToLevelObj> getExpToLevelTreeMap (){ return expToLevelTreeMap ; } }
这里又使用了TreeMap的特性,把exp(经验值)和level(等级)的对应关系放入TreeMap后,外界想知道一个随机的exp查出在多少level,是比较方便的。
最后我们会组装好一个expToLevelTreeMap 提供出去。
所以整个过程类似读取配置文件,进行不同的配置。
ExpToLevelObj :

public class ExpToLevelObj { public ExpToLevelObj(){ } public ExpToLevelObj(int id, int exp, int level, String name){ super(); this.id = id; this.exp = exp; this.level = level; this.name = name; } private int id; private int exp; private int level; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getExp() { return exp; } public void setExp(int exp) { this.exp = exp; } public int getLevel() { return level; } public void setLevel(int level) { this.level = level; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
外界使用:
下面的代码就可以查出25exp,处于多少等级了
TreeMap < Long, ExpToLevelObj > treeMap = expToLevelService . getExpToLevelTreeMap (); expToLevelObj = treeMap . lowerEntry( 25) .getValue () ; expToLevelObj . getLevel()
分类:
Java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述