罗展丰
Published on 2026-03-18 / 37 Visits
0
0

业务初始化

背景

在业务系统中,常常需要在系统启动时初始化一些基础数据,如部门结构、角色权限、用户账号等。为了统一管理这些初始化操作,提供标准化的初始化流程和日志记录,我们引入了 AbstractInitializer 抽象类,作为所有初始化器的基类。

模块概述

init 文件夹用于业务系统的初始化操作,主要负责系统启动时的基础数据初始化和管理。该模块基于 AbstractInitializer 抽象类实现,提供了标准化的初始化框架。

AbstractInitializer 介绍

核心能力

AbstractInitializer 抽象类提供了以下核心能力:

  • 标准化初始化流程:统一的初始化执行流程,包括启动日志、执行初始化、结束日志和耗时统计
  • 异常处理:捕获并记录初始化过程中的异常,确保初始化失败时能够及时发现
  • 启用/禁用控制:支持通过 enabled 属性控制初始化器是否执行
  • 名称自定义:支持通过重写 getName() 方法自定义初始化器名称

主要方法

方法名 描述 是否抽象
execute() 执行初始化操作的核心方法 是(必须实现)
doExecute() 执行初始化的入口方法,包含完整的执行流程 否(final 方法)
getName() 获取初始化器名称,默认为类名 否(可重写)
setEnabled(boolean) 设置初始化器是否启用 否
isEnabled() 获取初始化器是否启用 否
onStart() 初始化开始时的回调方法 否(可重写)
onEnd(long) 初始化结束时的回调方法,参数为耗时(毫秒) 否(可重写)

如何编写业务初始化类

创建初始化器实现类

创建一个继承自 AbstractInitializer 的实现类,实现 execute() 方法:


import com.sie.mbm.mom.framework.seeddata.init.AbstractInitializer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * @author 罗展丰
 * @date 2026/03/05
 * @description
 */
@Component
@Slf4j
public class InitUserData extends AbstractInitializer {


    @Override
    public String getName() {
        return "用户初始化";
    }

    @Override
    public void onStart() {
        super.onStart();
        log.info("UserData---onStart");
    }

    @Override
    public void execute() {
        log.info("逻辑写在这里");

    }

    @Override
    public void onEnd(long costTime) {
        super.onEnd(costTime);
        log.info("UserData---onEnd");
    }
}

初始化器的执行顺序

可以使用 @Order 注解控制初始化器的执行顺序:

import org.springframework.core.annotation.Order;

@Component
@Order(1) // 数字越小,执行顺序越靠前
public class InitDictData extends AbstractInitializer {
    // 实现代码...
}

@Component
@Order(2)
public class InitDepartmentData extends AbstractInitializer {
    // 实现代码...
}

使用方法

系统启动时自动扫描

系统启动时,初始化模块会自动执行所有注册的初始化器,确保系统基础数据的完整性。

执行日志示例:

2026-03-18 10:00:00.000 INFO  [main] c.s.i.s.i.InitDictData - InitDictData 开始执行初始化
2026-03-18 10:00:00.010 INFO  [main] c.s.i.s.i.InitDictData - 字典数据初始化完成
2026-03-18 10:00:00.011 INFO  [main] c.s.i.s.i.InitDictData - InitDictData 完成执行初始化, 耗时: 11ms
2026-03-18 10:00:00.012 INFO  [main] c.s.i.s.i.InitDepartmentData - InitDepartmentData 开始执行初始化
2026-03-18 10:00:00.020 INFO  [main] c.s.i.s.i.InitDepartmentData - 部门数据初始化完成
2026-03-18 10:00:00.021 INFO  [main] c.s.i.s.i.InitDepartmentData - InitDepartmentData 完成执行初始化, 耗时: 9ms

手动触发

可以通过访问以下API接口手动触发初始化操作:

执行全部初始化:

  • URL: POST http://localhost:8080/sys/v1/init/start
  • 方法: POST
  • 请求体: 无

响应示例:

{
  "code": 200,
  "msg": "success",
  "data": {
    "success": ["InitDictData", "InitDepartmentData", "InitRoleData", "InitUserData"],
    "fail": []
  }
}

Comment