springboot启动项目,自动从数据库加载一次系统配置

数据库中有状态有效的两行数据,想要的效果:在springboot启动的同时从数据库中加载一次获取到这两个配置设置到配置类SystemConfigProperties中,不写在配置文件中加载。

写这个配置文件SystemConfigProperties,最后数据库的值设置到configs上。

java 复制代码
package com.cao.config;

import com.cao.po.SystemConfig;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Data
@Component
@ConfigurationProperties(prefix = "system.config")
public class SystemConfigProperties {
    private List<SystemConfig> configs = new ArrayList<>();
}

写一个类SystemConfigLoader,实现 CommandLineRunner 接口,Spring Boot 会在应用启动完成后自动执行 run() 方法,从数据库配置信息设置到 SystemConfigProperties 中

java 复制代码
package com.cao.config;

import com.cao.mapper.SystemConfigMapper;
import com.cao.po.SystemConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 使用 CommandLineRunner 接口,Spring Boot 会在应用启动完成后自动执行 run() 方法,从数据库加载配置。
 */
@Slf4j
@Component
public class SystemConfigLoader implements CommandLineRunner {

    @Autowired
    private SystemConfigMapper systemConfigMapper;

    @Autowired
    private SystemConfigProperties systemConfigProperties;

    @Override
    public void run(String... args) throws Exception {
        log.info("开始加载系统配置...");
        try {
            List<SystemConfig> configs = systemConfigMapper.selectAllConfigs();
            if (configs != null && !configs.isEmpty()) {
                // 将配置信息设置到 SystemConfigProperties 中
                systemConfigProperties.setConfigs(configs);
                log.info("成功加载 {} 条系统配置", configs.size());
                for (SystemConfig config : configs) {
                    log.info("加载配置: appId={}, appName={}, status={}", config.getAppId(), config.getAppName(), config.getStatus());
                }
            } else {
                log.warn("未查询到任何系统配置数据");
            }
        } catch (Exception e) {
            log.error("加载系统配置失败", e);
            throw e;
        }
    }
}

SystemConfigMapper.java

java 复制代码
package com.cao.mapper;

import com.cao.po.SystemConfig;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface SystemConfigMapper {
    
    List<SystemConfig> selectAllConfigs();
}

SystemConfigMapper.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cao.mapper.SystemConfigMapper">
    
    <resultMap id="SystemConfigResultMap" type="com.cao.po.SystemConfig">
        <result column="app_id" property="appId"/>
        <result column="app_name" property="appName"/>
        <result column="app_key" property="appKey"/>
        <result column="private_key" property="privateKey"/>
        <result column="public_key" property="publicKey"/>
        <result column="status" property="status"/>
    </resultMap>
    
    <select id="selectAllConfigs" resultMap="SystemConfigResultMap">
        SELECT app_id, app_name, app_key, private_key, public_key, status
        FROM system_config
        WHERE status = 1
        ORDER BY app_id
    </select>
</mapper>

看控制台打印的日志

这样就在spring boot启动时候读取一遍数据库的配置信息,进行加载设置到SystemConfigProperties,比的地方使用直接注入SystemConfigProperties使用就行。