原理是:將數據庫變量放在一個全局的Map中,通過get讀取,寫好一個方法,用來操作數據庫配置項的加載,當每次數據庫配置項更改後,調取這個方法就可以實現刷新效果
@Component
public class BizConf {
private ReadWriteLock rwLock = new ReentrantReadWriteLock();
private final Lock rl = rwLock.readLock();
private final Lock wl = rwLock.writeLock();
private HashMap<String, String> kvs = new HashMap<String, String>();
private static Logger logger = LoggerFactory.getLogger(BizConf.class);
@Autowired
private Handyman handyman;
public String get(String k) {
String r = "";
rl.lock();
try {
r = kvs.get(k);
} finally {
rl.unlock();
}
return r;
}
@PostConstruct
public void refresh() {
wl.lock();
try {
List<ProxyPropertiesT> proxyPropertiesTs = handyman.allProxyList();
for (int i = 0; i < proxyPropertiesTs.size(); i++) {
ProxyPropertiesT proxyPropertiesT = proxyPropertiesTs.get(i);
String key = proxyPropertiesT.getProxyCode() + "_" + proxyPropertiesT.getConfigKey();
String value = proxyPropertiesT.getConfigValue();
if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)) {
//ignore password base on security concern
if(!key.contains("password")) {
logger.info("load property. Key=" + key + ",Value=" + value);
}
kvs.put(key, value);
}
}
List<SystemT> systemTs = handyman.allSystemConfig();
for (int i = 0; i < systemTs.size(); i++) {
SystemT systemT = systemTs.get(i);
String key = systemT.getSystemKey();
String value = systemT.getSystemValue();
if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)) {
logger.info("load property. Key=" + key + ",Value=" + value);
kvs.put(key, value);
}
}
} finally {
wl.unlock();
}
}
}