Spring Boot 初始化运行特定方法

Spring Boot提供了两种 “开机自启动” 的方式,ApplicationRunnerCommandLineRunner

这两种方式的目的是为了满足,在容器启动时like执行某些方法。我们可以通过实现ApplicationRunner或者CommandLineRunner来实现,他们都是在SpringAppliaction执行之后开始执行的。这个特性可以让我们自定义一些在容器启动时需要初始化的逻辑

 

ApplicationRunner接口

官方doc:

Interface used to indicate that a bean should run when it is contained within a SpringApplication. Multiple ApplicationRunner beans can be defined within the same application context and can be ordered using the Ordered

当该接口包含在SpringApplication中时执行。多个ApplicationRunner通过Order直接进行排序:

/**
 * 初始化类
 */
@Order(1) // @Order注解可以改变执行顺序,越小越先执行
@Component
public class MyApplicationRunner1 implements ApplicationRunner {

    /**
     * 会在服务启动完成后立即执行
     */
    @Override
    public void run(ApplicationArguments arg0) throws Exception {
        System.out.println("MyApplicationRunner1----" + arg0);
    }

}
/**
 * 初始化类
 */
@Order(2) 
@Component
public class MyApplicationRunner2 implements ApplicationRunner {

    /**
     * 会在服务启动完成后立即执行
     */
    @Override
    public void run(ApplicationArguments arg0) throws Exception {
        System.out.println("MyApplicationRunner2----" + arg0);
    }

}

容器启动后的运行结果:

可以看到多个ApplicationRunner执行顺序是按照Order中的值执行的,并且每个的入参都是同一个ApplicationArguments实例(具体原因后面分析)

 

CommandLineRunner接口

二者的官方doc基本一样,区别在于接收的参数不一样

/**
 * 初始化类
 */
@Order(1) // @Order注解可以改变执行顺序,越小越先执行
@Component
public class MyCommandLineRunner1 implements CommandLineRunner {

    /**
     * 会在服务启动完成后立即执行
     */
    @Override
    public void run(String... args) throws Exception {
        System.out.println("MyCommandLineRunner1----" + args);
    }

}
/**
 * 初始化类
 */
@Order(2)
@Component
public class MyCommandLineRunner2 implements CommandLineRunner {

    /**
     * 会在服务启动完成后立即执行
     */
    @Override
    public void run(String... args) throws Exception {
        System.out.println("MyCommandLineRunner2----" + args);
    }

}

容器启动后的运行结果:

可以看到多个CommandLineRunner的执行效果跟ApplicationRunner一模一样

 

最后看下源码:

SpringApplication启动时,会执行其run方法中的afterRefresh方法:

在afterRefresh中可以看到这两个接口被执行,并且每个ApplicationRunner或CommandLineRunner实例都是用的同一个入参:

 

转载于:https://www.cnblogs.com/xuwenjin/p/10430936.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值