SpringBoot 提供了一些接口来实现:

方式适用场景适用范围
CommandLineRunner / ApplicationRunner适用于执行启动后任务,顺序可控Spring Boot 启动完成后
ApplicationReadyEvent 监听适用于所有 Bean 加载完毕后保证所有 Bean 都已准备就绪
@PostConstruct适用于 Bean 初始化后仅适用于单个 Bean

一般推荐使用 CommandLineRunnerApplicationReadyEvent,它们能确保 Spring Boot 启动完成后执行逻辑,同时避免 @PostConstruct 在某些情况下的不确定性。

ApplicationRunner

@Component
public class PermissionRoleSyncRunner implements ApplicationRunner {
 
    @Autowired
    private PermissionRoleService permissionRoleService;
 
    @Autowired
    private StringRedisTemplate redisTemplate;
 
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("Spring Boot 启动完成,开始同步权限角色数据到 Redis...");
        var permissionRoleData = permissionRoleService.getAllPermissionRoles();
        redisTemplate.opsForValue().set("permission_role_data", permissionRoleData.toString());
        System.out.println("同步完成!");
    }
}