Springboot项目启动后执行特定方法

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!");
    }

}

参考文档:

https://www.jianshu.com/p/fa2783cee2a7

posted @ 2019-09-05 16:44  趙小傑  阅读(405)  评论(0编辑  收藏  举报