springboot2.X 在项目启动后执行一段自定义代码
场景: 项目需要在项目启动后从数据库初始化一些数据进入redis , 但是没有很适合 的监听器去实现 , 监听 老是在dao初始化之前触发。
解决方法:自定义类实现 ApplicationRunner 接口 重写 run() 方法
------------------------------------------------------------------------------------------------------------------------------------------
1 /** 2 * @author :CX 3 * @Date :Create in 2018/8/31 11:39 4 * @Effect : 监听项目启动成功后, 每次启动给启动序列码+1(tb_sb_idcounter表) , 5 * 并吧最新的序列码写入redis 6 */ 7 @Component 8 @Order(10) //执行的优先级 9 public class StartIdListener implements ApplicationRunner { 10 Logger logger = Logger.getLogger(this.getClass().getName()); 11 //注入针对数据库的dao 12 @Autowired 13 @Qualifier("dao") 14 protected IDao dao; 15 //注入针对redis的dao 16 @Autowired 17 RedisUtil redisUtil ; 18 19 // 系统启动序列码在redis中保存的key 20 private String SYSTEM_NUMBER = "bigcustomer:systemNumber_fh23" ; 21 // 本次啓動 , 通用id 执行到几了, 继续执行 22 private String FUNIQUEID_NUMBER = "bigcustomer:funiqueid_number" ; 23 /** 24 *@参数 25 *@返回值 26 *@创建人 cx 27 *@创建时间 28 *@描述 zaispringboot启动后执行 29 */ 30 @Override 31 public void run(ApplicationArguments args) throws Exception { 32 //数据库启动序列码 +1 33 logger.info("项目启动成功, 开始获取启动码!"); 34 try{ 35 dao.update("util-baseIdUpOne"); 36 }catch (Exception e){ 37 throw new RuntimeException("启动失败,启动序列码执行+1 操作时异常!请检查 tb_sb_idcounter表"); 38 } 39 // 获取最新数据 40 TbSbIdcounterModel first = dao.entity(TbSbIdcounterModel.class).first(); 41 if(null == first || null == first.getFH23()){ 42 throw new RuntimeException("启动失败,启动序列码为空,请检查 tb_sb_idcounter表"); 43 } 44 Long fh23 = first.getFH23(); 45 // 保存启动序列码到redis 46 redisUtil.set(SYSTEM_NUMBER,fh23); 47 // 初始化本次 轮训的编码 48 redisUtil.set(FUNIQUEID_NUMBER,1); 49 50 51 logger.info("获取启动码成功, 本次系统启动码为:" + fh23); 52 } 53 }