- ResourceBundle properties
- 第一次读取之后便存入缓存,本来是件好事,却也使得动态更新加载配置文件变得复杂起来……
- 在后来的版本中提供了这样的方法可以清空缓存 :
- ResourceBundle.clearCache();
- ResourceBundle.clearCache(ClassLoader loader);
- 但使用中确实有很多问题,于是用其他办法来处理这个问题:
- ResourceBundle.getBundle(path, control);
- 首先通过control的方式是可以指定是更新及更新时间的,但有点问题,有些我们不想更新,或者有些我想立即更新,用ResourceBundle.Control原本给的方法显然满足不了我的需求。
- 所以,重写这个类,加上想要的部分:
- /**
- * 配置文件读取控制
- * @author slzs
- * Dec 30, 2011 2:17:18 PM
- * 每位工程师都有保持代码优雅的义务
- * each engineer has a duty to keep the code elegant
- */
- class MyControl extends ResourceBundle.Control {
- // 存在此变量的配置文件名字将执行一次更新
- private final static List<String> needsReloadBaseNameArray = new ArrayList<String>();
- // 配置文件控制器
- private static MyControl myControl;
- private MyControl() {
- }
- public synchronized static MyControl getControl() {
- if (myControl == null) {
- myControl = new MyControl();
- }
- return myControl;
- }
- /**
- * 检查间隔(对符合条件的对象立即更新)
- */
- @Override
- public long getTimeToLive(String baseName, Locale locale) {
- return 0;
- }
- /**
- * 是否需要重新加载的判断函数
- * overriding方法
- * @see java.util.ResourceBundle$Control#needsReload(java.lang.String, java.util.Locale, java.lang.String, java.lang.ClassLoader, java.util.ResourceBundle, long)
- * @author: slzs
- * Dec 30, 2011 2:17:47 PM
- * @param baseName
- * @param locale
- * @param format
- * @param loader
- * @param bundle
- * @param loadTime
- * @return
- * 每位工程师都有保持代码优雅的义务
- * each engineer has a duty to keep the code elegant
- */
- @Override
- public boolean needsReload(String baseName, Locale locale, String format, ClassLoader loader, ResourceBundle bundle, long loadTime) {
- boolean needsReload = false;
- if (needsReloadBaseNameArray.size() > 0) {
- // 检查需要更新的队列是否有此次读取的内容
- for (String needsReloadBaseName : needsReloadBaseNameArray) {
- if (needsReloadBaseName.equals(baseName)) {
- // 需要更新
- needsReload = true;
- // 更新一次从队列中移出
- needsReloadBaseNameArray.remove(needsReloadBaseName);
- break;
- }
- }
- }
- return needsReload;
- }
- /**
- * 添加需要更新的配置
- * @author: slzs
- * Dec 30, 2011 3:20:16 PM
- * @param baseName void
- * 每位工程师都有保持代码优雅的义务
- * each engineer has a duty to keep the code elegant
- */
- public static void addNeedsReloadBaseName(String baseName) {
- this.needsReloadBaseNameArray.add(baseName);
- }
- }
- 现在就可以控制是否对配置文件进行重加载了:
- public class GetProperties {
- /**
- * 得到配置文件中key对应值
- *
- * @param key
- * @param name 不包含后缀名的名字
- * @return String
- */
- public static String getValue(String key, String name) {
- ResourceBundle myResources = ResourceBundle.getBundle(name, MyControl.getControl());
- // ........中间省略
- return value;
- }
- /**
- * 设置并更新配置文件
- * @author: slzs
- * Nov 2, 2011 11:09:39 AM
- * @param key 键
- * @param value 值
- * @param path 物理路径
- * @param baseName 部署路径
- * 每位工程师都有保持代码优雅的义务
- * each engineer has a duty to keep the code elegant
- */
- public static void setProperties(String key, String value, String path, String baseName) {
- // ...中间写入省略
- // 将baseName设置更新读取,下次读取时就会读取最新数据
- myControl.addNeedsReloadBaseName(baseName);
- ResourceBundle.getBundle(rootPath + baseName, MyControl.getControl());
- }
- }
转载于:https://blog.51cto.com/lya041/1177876