Spring Boot 初始化运行特定方法解析

网友投稿 302 2022-12-27


Spring Boot 初始化运行特定方法解析

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

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

ApplicationRunner接口:

官方doc:

Interface uttoRKxsed 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("MyApplicationhttp://Runner2----" + 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实例都是用的同一个入参:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:邮件接口测试工具有哪些(邮件接口测试工具有哪些功能)
下一篇:银行储蓄系统接口设计(银行储蓄系统接口设计规范)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~