Springboot项目启动后执行特定方法
Springboot给我们提供了两种“开机启动”方式:ApplicationRunner和CommandLineRunner。
这两种方法提供的目的是为了满足,在项目启动的时候立刻执行某些方法。我们可以通过实现ApplicationRunner和CommandLineRunner,来实现,他们都是在SpringApplication 执行之后开始执行的。
CommandLineRunner接口可以用来接收字符串数组的命令行参数,ApplicationRunner 是使用ApplicationArguments 用来接收参数的。
一、使用 CommandLineRunner
package cn.pconline.common.command;
import cn.pconline.common.constant.CommonConstant;
import cn.pconline.common.redis.client.RedisClient;
import cn.pconline.entity.Coupon;
import lombok.extern.slf4j.Slf4j;
import org.gelivable.dao.GeliDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @Description 项目启动执行
* @Author jie.zhao
* @Date 2019/9/5 11:08
*/
@Slf4j
@Component
public class MyCommandLineRunner implements CommandLineRunner {
@Autowired
private GeliDao geliDao;
@Autowired
private RedisClient redisClient;
@Override
public void run(String... var1) throws Exception {
log.info("This will be execute when the project was started!");
//优惠卷初始化
List<Coupon> couponList = geliDao.list(Coupon.class, "SELECT * FROM bjdev190812_coupon");
couponList.forEach(coupon -> {
redisClient.string().set(CommonConstant.COUPON_LIST + coupon.getId(), coupon.getCouponNum());
});
//处理业务
}
}
二、使用 ApplicationRunner
package cn.pconline.common.command;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
/**
* @Description 项目启动执行
* @Author jie.zhao
* @Date 2019/9/5 16:37
*/
@Slf4j
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments var1) throws Exception{
log.info("MyApplicationRunner class will be execute when the project was started!");
//处理业务
}
}
三、项目启动测试
2019-09-05 16:39:27.133 INFO 47936 --- [ resin-40] cn.pconline.GeliSpringbootApplication : Started GeliSpringbootApplication in 15.141 seconds (JVM running for 26.088)
2019-09-05 16:39:25.145 INFO 47936 --- [ resin-40] c.p.common.command.MyApplicationRunner : MyApplicationRunner class will be execute when the project was started!
2019-09-05 16:39:27.145 INFO 47936 --- [ resin-40] c.p.common.command.MyCommandLineRunner : This will be execute when the project was started!
这两种方式的实现都很简单,直接实现了相应的接口就可以了。
记得在类上加@Component注解。
四、指定启动方法执行的顺序
如果想要指定启动方法执行的顺序,可以通过实现org.springframework.core.Ordered接口或者使用org.springframework.core.annotation.Order注解来实现。
以ApplicationRunner 为例来分别实现。
1、Ordered接口:
Component
public class MyApplicationRunner implements ApplicationRunner,Ordered{
@Override
public int getOrder(){
return 1;//通过设置这里的数字来知道指定顺序
}
@Override
public void run(ApplicationArguments var1) throws Exception{
System.out.println("MyApplicationRunner1!");
}
}
2、Order注解实现方式:
@Component
@Order(value = 1)
public class MyApplicationRunner implements ApplicationRunner{
@Override
public void run(ApplicationArguments var1) throws Exception{
System.out.println("MyApplicationRunner1!");
}
}
参考文档: