背景
在业务系统中,常常需要在系统启动时初始化一些基础数据,如部门结构、角色权限、用户账号等。为了统一管理这些初始化操作,提供标准化的初始化流程和日志记录,我们引入了 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": []
}
}