解决问题
项目启动时需要手动脚本处理SQL问题,比如账号初始化,而密码又需要加密完成的情况
初始化配置类
import com.fan.model.document.DocumentService;
import com.fan.model.userAdmin.UserAdminService;
import jakarta.annotation.Resource;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* 初始化数据
*/
@Component
@Order(2)
public class InitData implements ApplicationRunner {
@Resource
private UserAdminService userAdminService;
@Override
public void run(ApplicationArguments args) {
userAdminService.initUserAdmin();
}
}
问题:@Order(2) 不够可靠,只能控制同一类型(都是ApplicationRunner)的执行顺序,但无法保证在所有MyBatis相关Bean(如 SqlSessionFactory、Mapper扫描)初始化完成后才执行,更稳妥的做法是:监听ApplicationReadyEvent
另一种方法
@Component
public class InitData {
@Resource
private UserAdminService userAdminService;
@EventListener(ApplicationReadyEvent.class)
public void init() {
userAdminService.initUserAdmin();
}
}
ApplicationReadyEvent在所有Bean加载完成、应用完全启动后才触发,时机最安全