罗展丰
Published on 2026-03-18 / 5 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