如何动态的获取property文件的信息

使用ResourceBundle类可以获取资源信息.如,通过getBundle("资源名")来获取一个propertie文件的文本内容,并将其转化为Map的形式存储.看了一点源码,ResourceBundle类在加载时就创建了一个ConcurrentMap<CacheKey, BundleReference> cacheList,所有的Bundle资源在查找之后就存储到cacheList中,每次获取先从cacheList中获取,这样就有缓存.只有判断当bundle发生变化时,才重新通过名称进行查找.

当然,还有更简单的方法,使用 ResourceBundle.Control类来控制重载时间和是否需要重载,需要重写getTimeToLive和needsReload方法,一个设置重载时间,一个判断是否需要重载,这样就可以实现按时重载.

package com.sanji.mall.app.action;


import com.sanji.mall.app.goods.controller.GoodsController;
import com.sanji.mall.app.util.ResponseFactory;
import com.sanji.mall.common.util.ResourceUtil;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.*;

/**
 * 示例url:  localhost:端口号:/appApi/hello/index
 * Created by yangqc on 2017/2/24.
 */

@Controller
@RequestMapping("/common")
public class CommonController {
    private final Logger logger = Logger.getLogger(GoodsController.class);
    /**
     * 定义一个control进行控制
     */
    private ResourceBundle.Control control = new ResourceBundle.Control() {
        @Override
        public long getTimeToLive(String baseName, Locale locale) {
            return 0;
            // return 1000 * 60 * 10;
        }

        @Override
        public boolean needsReload(String baseName, Locale locale,
                                   String format, ClassLoader loader, ResourceBundle bundle,
                                   long loadTime) {
            return true;
        }
    };

    /**
     * 获取手机页轮播地址及跳转参数;
     *
     * @return
     */
    @RequestMapping("/switchPic")
    @ResponseBody
    public Object getPic() {
        try {
            String preUrl = ResourceUtil.get("stwitchPicPreUrl");
//            ResourceBundle.clearCache();
            String[] picValues = ResourceBundle.getBundle("appConfig", control).getString("appSwitchGoodsUrls").split(";");
            List<Map<String, String>> reList = new ArrayList<>();
            for (String picValue : picValues) {
                handlePicItem(preUrl, reList, picValue);
            }
            return ResponseFactory.getSuccussed(reList);
        } catch (Exception e) {
            logger.info("获取轮播图片异常:" + e.getMessage());
            return ResponseFactory.getFailed("获取轮播图片失败" + e.getLocalizedMessage());
        }
    }

    /**
     * 处理一个图片轮播地址项
     */
    private void handlePicItem(String preUrl, List<Map<String, String>> reList, String picValue) {
        Map<String, String> remap = new HashMap<String, String>();
        String[] vals = picValue.split("-->");
        remap.put("ingUrl", preUrl + vals[0]);
        remap.put("num", vals[1]);
        remap.put("type", vals[2]);
        reList.add(remap);
    }
}

appConfig.properties

# 图片文件-->num-->type;每项之间用英文逗号隔开;num为编码, type:手机类为sj;配件类为accessory
appSwitchGoodsUrls=1.png-->121-->sj;2.png-->1570-->sj;3.png-->1544-->sj;4.png-->121-->sj;5.png-->905367-->accessory;

转载于:https://my.oschina.net/u/1590027/blog/857589

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值