Spring启动加载数据库信息到缓存----即注入没有注解管理的类
程序员文章站
2022-05-04 08:48:21
背景:项目做主备方案,期望服务器经常改动的配置文件入库存储。故需将原服务器部分配置文件转存到数据库,并保持原来缓存类读取这部分配置能正常使用,尽可能改动最小。方案:spring 启动加载数据库配置文件到spring 的bean中管理,缓存类读取bean获取。修改配置信息时同时维护数据库信息、bean和缓存类。注意事项:迭代升级。启动加载配置类:package com.xdja.pki.ra.service.manager;import com.xdja.pki.ra.core.co....
背景:项目做主备方案,期望服务器经常改动的配置文件入库存储。故需将原服务器部分配置文件转存到数据库,并保持原来缓存类读取这部分配置能正常使用,尽可能改动最小。
方案:spring 启动加载数据库配置文件到spring 的bean中管理,缓存类读取bean获取。修改配置信息时同时维护数据库信息、bean和缓存类。
注意事项:迭代升级。
启动加载配置类:
package com.xdja.pki.ra.service.manager;
import com.xdja.pki.ra.core.config.Config;
import com.xdja.pki.ra.core.constant.Constants;
import com.xdja.pki.ra.core.constant.PathConstants;
import com.xdja.pki.ra.core.util.file.FileUtils;
import com.xdja.pki.ra.service.manager.system.SystemService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.File;
/**
* 加载数据库配置文件
*
* @author wly
*/
@Configuration
public class ConfigFileData {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
SystemService systemService;
@Bean
public Config configFile(){
try {
/**
* 从数据库获取配置文件内容
*/
Config config = systemService.getConfigFile(Constants.CONFIG_JSON_FILE_NAME);
if (null == config) {
/**
* 迭代升级 读取服务器配置文件
*/
config = Config.getConfig(PathConstants.GLOBAL_CONF_FILE_PATH);
String content = FileUtils.read(PathConstants.DEFAULT_CONTAINER_PATH);
config.setDefaultContainer(content.substring(21,content.length()-2));
/**
* 本迭代新增配置项
*/
config.setRaBaseDn("");
/**
* 删除服务器配置文件
*/
FileUtils.deleteFile(new File(PathConstants.DEFAULT_CONTAINER_PATH));
FileUtils.deleteFile(new File(PathConstants.GLOBAL_CONF_FILE_PATH));
/**
* 存库
*/
systemService.saveConfigFile(config);
}
logger.info("系统启动加载config.json配置文件" + config);
return config;
} catch (Exception e) {
logger.error("加载config.json配置文件失败", e);
}
return null;
}
}
这个操作会将config加载到spring中,获取该bean方式:
Config config = (Config) SpringUtils.getBean("configFile");
//configFile 是加载bean时的方法名
缓存类(示例部分参数):
package com.xdja.pki.test.util;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.security.cert.X509Certificate;
/**
* 全局缓存变量
*
* @author
*/
public class CommonVariable {
private static Logger logger = LoggerFactory.getLogger(CommonVariable.class);
private static String caServiceIp;
private static int caServicePort;
private static Integer isHsm;
private static Config config = (Config) SpringUtils.getBean("configFile");
public static Config getConfig() {
return config;
}
public static void setConfig(Config config) {
CommonVariable.config = config;
}
public static void setIsHsm(Integer isHsm) {
config.setIsHsm(isHsm);
CommonVariable.isHsm = isHsm;
}
public static String getCaServiceIp() {
if (StringUtils.isNotBlank(caServiceIp)) {
return caServiceIp;
}
CommonVariable.caServiceIp = config.getCaServerConf().getCaServerIp();
return caServiceIp;
}
public static void setCaServiceIp(String caServiceIp) {
CaServerConf caServerConf = config.getCaServerConf();
if (null == caServerConf) {
caServerConf = new CaServerConf();
}
caServerConf.setCaServerIp(caServiceIp);
config.setCaServerConf(caServerConf);
CommonVariable.caServiceIp = caServiceIp;
}
public static int getCaServicePort() {
if (0 != caServicePort) {
return caServicePort;
}
logger.info("ra系统配置文件: " + JsonUtils.object2Json(config));
CommonVariable.caServicePort = Integer.valueOf(config.getCaServerConf().getCaServerPort());
return caServicePort;
}
public static void setCaServicePort(int caServicePort) {
CaServerConf caServerConf = config.getCaServerConf();
if (null == caServerConf) {
caServerConf = new CaServerConf();
}
caServerConf.setCaServerPort(caServicePort);
config.setCaServerConf(caServerConf);
CommonVariable.caServicePort = caServicePort;
}
public static Integer getIsHsm() {
if (null != isHsm) {
return isHsm;
}
CommonVariable.isHsm = config.getIsHsm();
return isHsm;
}
public static void clear() {
CommonVariable.caServiceCert = null;
CommonVariable.caServiceIp = null;
CommonVariable.isHsm = null;
}
}
因原使用方式中CommonVariable.java 的参数包含了Config.java的部分以及其他参数,所以需要同时维护这两个类,实际使用可以根据需求来定。
Config.java
/**
* 初始化配置文件
*
* @author
*/
public class Config {
private int initStep;
// ......
private CaServerConf caServerConf;
//todo get set
@Override
public String toString() {
//todo
}
}
提供几个操作接口类:(实现层略)
package com.xdja.pki.ra.service.manager.system;
import com.xdja.pki.ra.core.common.Result;
import com.xdja.pki.ra.core.config.Config;
/**
* @author
*/
public interface SystemService {
/**
* 获取配置文件
* @param fileName
* @return
*/
Config getConfigFile(String fileName);
/**
* 修改配置文件
* @param config
* @return
*/
Result updateConfigFile(Config config);
/**
* 保存配置文件 升级使用
* @param config
* @return
*/
void saveConfigFile(Config config);
}
具体调用:
@Override
public Result isHsm() {
Result result = new Result();
try {
Config config = systemService.getConfigFile(Constants.CONFIG_JSON_FILE_NAME);
if (null == config) {
result.setError(ErrorEnum.CONFIG_JSON_FILE_OPERATION_ERROR);
return result;
}
//配置不使用密码机
config.setIsHsm(Constants.HSM_SERVER_0);
CommonVariable.setIsHsm(Constants.HSM_SERVER_0);
//记录步骤数
config.setInitStep(Constants.HSM_SERVER_PAGE);
systemService.updateConfigFile(config);
} catch (Exception e) {
logger.info("修改配置文件异常",e);
result.setError(ErrorEnum.CONFIG_JSON_FILE_OPERATION_ERROR);
return result;
}
return null;
}
本文地址:https://blog.csdn.net/weixin_42209368/article/details/107682796
上一篇: 龙泉驿枇杷有什么特点?枇杷有什么营养?
下一篇: Mysql_InnoDB_文件