欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring启动加载数据库信息到缓存----即注入没有注解管理的类

程序员文章站 2022-10-03 14:41:17
背景:项目做主备方案,期望服务器经常改动的配置文件入库存储。故需将原服务器部分配置文件转存到数据库,并保持原来缓存类读取这部分配置能正常使用,尽可能改动最小。方案: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

相关标签: 学习笔记