您的位置:首页 > 运维架构

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

2017-03-13 00:00 369 查看
摘要: 使用ResourceBundle,动态获取bundle来更新资源配置

使用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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ResourceBundle