1. ResourceBundle  properties 
  2. 第一次读取之后便存入缓存,本来是件好事,却也使得动态更新加载配置文件变得复杂起来…… 
  3. 在后来的版本中提供了这样的方法可以清空缓存 : 
  4. ResourceBundle.clearCache();  
  5. ResourceBundle.clearCache(ClassLoader loader); 
  6. 但使用中确实有很多问题,于是用其他办法来处理这个问题: 
  7. ResourceBundle.getBundle(path, control); 
  8. 首先通过control的方式是可以指定是更新及更新时间的,但有点问题,有些我们不想更新,或者有些我想立即更新,用ResourceBundle.Control原本给的方法显然满足不了我的需求。 
  9. 所以,重写这个类,加上想要的部分: 
  10. /** 
  11.  * 配置文件读取控制 
  12.  * @author slzs 
  13.  * Dec 30, 2011 2:17:18 PM 
  14.  * 每位工程师都有保持代码优雅的义务 
  15.  * each engineer has a duty to keep the code elegant 
  16.  */ 
  17. class MyControl extends ResourceBundle.Control { 
  18.  // 存在此变量的配置文件名字将执行一次更新 
  19.  private final static List needsReloadBaseNameArray = new ArrayList(); 
  20.  // 配置文件控制器 
  21.  private static MyControl   myControl; 
  22.  private MyControl() { 
  23.  } 
  24.  public synchronized static MyControl getControl() { 
  25.   if (myControl == null) { 
  26.    myControl = new MyControl(); 
  27.   } 
  28.   return myControl; 
  29.  } 
  30.  /** 
  31.   * 检查间隔(对符合条件的对象立即更新) 
  32.   */ 
  33.  @Override 
  34.  public long getTimeToLive(String baseName, Locale locale) { 
  35.   return 0
  36.  } 
  37.  /** 
  38.   * 是否需要重新加载的判断函数 
  39.   * overriding方法 
  40.   * @see java.util.ResourceBundle$Control#needsReload(java.lang.String, java.util.Locale, java.lang.String, java.lang.ClassLoader, java.util.ResourceBundle, long) 
  41.   * @author: slzs 
  42.   * Dec 30, 2011 2:17:47 PM 
  43.   * @param baseName 
  44.   * @param locale 
  45.   * @param format 
  46.   * @param loader 
  47.   * @param bundle 
  48.   * @param loadTime 
  49.   * @return 
  50.   * 每位工程师都有保持代码优雅的义务 
  51.   * each engineer has a duty to keep the code elegant 
  52.   */ 
  53.  @Override 
  54.  public boolean needsReload(String baseName, Locale locale, String format, ClassLoader loader, ResourceBundle bundle, long loadTime) { 
  55.   boolean needsReload = false
  56.   if (needsReloadBaseNameArray.size() > 0) { 
  57.    // 检查需要更新的队列是否有此次读取的内容 
  58.    for (String needsReloadBaseName : needsReloadBaseNameArray) { 
  59.     if (needsReloadBaseName.equals(baseName)) { 
  60.      // 需要更新 
  61.      needsReload = true
  62.      // 更新一次从队列中移出 
  63.      needsReloadBaseNameArray.remove(needsReloadBaseName); 
  64.      break
  65.     } 
  66.    } 
  67.   } 
  68.   return needsReload; 
  69.  } 
  70.  /** 
  71.   * 添加需要更新的配置 
  72.   * @author: slzs 
  73.   * Dec 30, 2011 3:20:16 PM 
  74.   * @param baseName void 
  75.   * 每位工程师都有保持代码优雅的义务 
  76.   * each engineer has a duty to keep the code elegant 
  77.   */ 
  78.  public static void addNeedsReloadBaseName(String baseName) { 
  79.   this.needsReloadBaseNameArray.add(baseName); 
  80.  } 
  81.   
  82. 现在就可以控制是否对配置文件进行重加载了: 
  83. public class GetProperties { 
  84.  /** 
  85.   * 得到配置文件中key对应值 
  86.   *  
  87.   * @param key 
  88.   * @param name 不包含后缀名的名字 
  89.   * @return String 
  90.   */ 
  91.  public static String getValue(String key, String name) { 
  92.    ResourceBundle myResources = ResourceBundle.getBundle(name, MyControl.getControl()); 
  93.    // ........中间省略 
  94.    return value; 
  95.  } 
  96.  
  97.  /** 
  98.   * 设置并更新配置文件 
  99.   * @author: slzs 
  100.   * Nov 2, 2011 11:09:39 AM 
  101.   * @param key 键 
  102.   * @param value 值 
  103.   * @param path 物理路径 
  104.   * @param baseName 部署路径 
  105.   * 每位工程师都有保持代码优雅的义务 
  106.   * each engineer has a duty to keep the code elegant 
  107.   */ 
  108.  public static void setProperties(String key, String value, String path, String baseName) { 
  109.     // ...中间写入省略 
  110.     // 将baseName设置更新读取,下次读取时就会读取最新数据  
  111.     myControl.addNeedsReloadBaseName(baseName); 
  112.     ResourceBundle.getBundle(rootPath + baseName, MyControl.getControl()); 
  113.  }