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;
        }

    }
View Code
复制代码

外界使用:

  下面的代码就可以查出25exp,处于多少等级了

TreeMap < Long, ExpToLevelObj > treeMap = expToLevelService . getExpToLevelTreeMap ();

expToLevelObj = treeMap . lowerEntry( 25) .getValue () ;

expToLevelObj . getLevel()

 

 
 
 

posted on   每当变幻时  阅读(3399)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 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的设计模式综述

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示