package com.imyeyu.api.util; import com.imyeyu.api.bean.SettingEnum; import com.imyeyu.api.config.dbsource.TimiServerDBConfig; import com.imyeyu.api.modules.common.entity.Setting; import com.imyeyu.api.modules.common.service.SettingService; import com.imyeyu.java.TimiJava; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.core.type.filter.AssignableTypeFilter; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; /// 启动时初始化内建系统配置 /// /// @author 夜雨 /// @since 2026-09-08 @Component @RequiredArgsConstructor @Order(Ordered.HIGHEST_PRECEDENCE) public class InitBuiltinSetting implements ApplicationRunner { /// 设置枚举所在的扫描包 private static final String SCAN_PACKAGE = "com.imyeyu.api"; private final SettingService settingService; /// 初始化所有设置枚举对应的系统配置 /// /// @param args 启动参数 /// @throws Exception 初始化异常 @Override @Transactional(TimiServerDBConfig.ROLLBACKER) public void run(ApplicationArguments args) throws Exception { for (SettingEnum item : findSettingEnumList()) { if (settingService.getSystem(item) == null) { Setting setting = new Setting(); setting.setBizType(item.getBizType()); setting.setBizId(TimiJava.ZERO_UUID); setting.setCode(item.name()); setting.setValue(item.getDefaultValue()); setting.setValueType(item.getValueType()); setting.setIsPrivate(true); settingService.create(setting); } } } /// 扫描所有实现设置枚举接口的枚举常量 /// /// @return 设置枚举常量列表 /// @throws ClassNotFoundException 枚举类无法加载 private List findSettingEnumList() throws ClassNotFoundException { ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false); scanner.addIncludeFilter(new AssignableTypeFilter(SettingEnum.class)); List candidateList = new ArrayList<>(scanner.findCandidateComponents(SCAN_PACKAGE)); List result = new ArrayList<>(); for (BeanDefinition candidate : candidateList) { String className = candidate.getBeanClassName(); if (className == null) { continue; } Class candidateClass = Class.forName(className); if (!candidateClass.isEnum() || !SettingEnum.class.isAssignableFrom(candidateClass)) { continue; } for (Object constant : candidateClass.getEnumConstants()) { result.add((SettingEnum) constant); } } return result; } }