1、定义初始化接口(制定规范)
public interface Initializer {
/**
* 初始化
*
* @param
* @return void
* @throws Exception
*/
void init() throws Exception;
/**
* 执行顺序
*
* @return
*/
default int getOrder() {
return 0;
}
}
2、模板设计模式抽取公共方法
@Slf4j
public abstract class AbstractDataUpgradeInitializer implements Initializer {
private final InitDataRecordRepository initDataRecordRepository;
protected AbstractDataUpgradeInitializer(InitDataRecordRepository initDataRecordRepository) {
this.initDataRecordRepository = initDataRecordRepository;
}
/**
* 初始化数据业务唯一标识
*
* @return 业务唯一标识
*/
protected abstract String getBusinessKey();
/**
* 初始化数据唯一key
*
* @return 唯一key
*/
protected abstract String getInitDataKey();
/**
* 业务处理
*/
protected abstract void process();
@Override
public void init() {
try {
initDataUpdate();
} catch (Exception e) {
log.error("数据初始化异常", e);
}
}
/**
* 初始化数据升级
*/
private void initDataUpdate() {
// 查询数据初始化记录
InitDataRecord byBusinessKeyAndInitDataKey = initDataRecordRepository.findByBusinessKeyAndInitDataKey(getBusinessKey(), getInitDataKey());
if (Objects.nonNull(byBusinessKeyAndInitDataKey)) {
// 如有记录说明已经做过数据初始化
return;
}
// 业务处理
process();
// 本次启动已升级,保存升级记录,下次服务启动将不再升级
saveInitDataRecord();
}
/**
* 保存数据升级记录
*/
private void saveInitDataRecord() {
InitDataRecord initDataRecord = new InitDataRecord();
initDataRecord.setBusinessKey(getBusinessKey());
initDataRecord.setInitDataKey(getInitDataKey());
initDataRecord.setInitDataTime(LocalDateTime.now());
initDataRecordRepository.save(initDataRecord);
}
3、子类具体实现
@Component
public class CompositionRegisterStatusInitializer extends AbstractDataUpgradeInitializer {
private final CompositionRepository compositionRepository;
public CompositionRegisterStatusInitializer(InitDataRecordRepository initDataRecordRepository,
CompositionRepository chartRepository) {
super(initDataRecordRepository);
this.compositionRepository = chartRepository;
}
@Override
protected String getBusinessKey() {
return "COMPOSITION_UPDATE";
}
@Override
protected String getInitDataKey() {
return "20221201191500";
}
@Override
protected void process() {
List<Composition> all = compositionRepository.findAll();
for (Composition composition : all) {
if (CompositionEnum.ENERGY.getName().equals(composition.getCompositionName()) || CompositionEnum.CARBON_WATER.getName().equals(composition.getCompositionName())) {
composition.setSource(SourceEnum.FIXED.toString());
} else {
composition.setSource(SourceEnum.EXCEL.toString());
}
//composition.setEnergyCoefficient(BigDecimal.ZERO);
//composition.setCarbonWater(IsOrNoEnum.NO.getName());
}
compositionRepository.saveAll(all);
}
}
4、项目启动后执行
@Component
@Slf4j
public class SystemInitialization implements ApplicationRunner {
/**
* 初始化器的容器
*/
@Autowired
Map<String, Initializer> initializerMap;
@Override
public void run(ApplicationArguments args) throws Exception {
List<Map.Entry<String, Initializer>> list = new ArrayList<Map.Entry<String, Initializer>>(initializerMap.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Initializer>>() {
@Override
public int compare(Map.Entry<String, Initializer> o1, Map.Entry<String, Initializer> o2) {
return o1.getValue().getOrder() - o2.getValue().getOrder();
}
});
log.info("系统启动开始初始化!,共{}条", initializerMap.size());
int num = 0;
// 遍历各初始化器进行初始化
for (Map.Entry<String, Initializer> entry : list) {
log.info("系统启动项:{},开始初始化", entry.getValue().getClass());
num++;
log.info("当前执行的第{}条", num);
entry.getValue().init();
log.info("系统启动项:{},初始化结束", entry.getValue().getClass());
}
}
}