Spring Boot 初始化运行特定方法解析
Spring Boot提供了两种 “开机自启动” 的方式,ApplicationRunner和CommandLineRunner
这两种方式的目的是为了满足,在容器启动时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实例都是用的同一个入参:
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
- SpringBoot应用启动服务要执行一些初始化操作的可用方法@PostConstruct与CommandLineRunner、ApplicationRunner
- Spring boot项目打包成jar运行的二种方法
- Springboot打成war包并在tomcat中运行的部署方法
- Spring Boot学习--项目启动时执行特定方法
- Spring Boot学习--项目启动时执行特定方法(对于quartz 任务调度一样也是可行)
- springboot添加fastjson第三方json解析工具方法(默认jackjson)
- SpringBoot(2)—启动原理之run方法的运行
- Spring Boot非Web项目运行的方法
- 缺省配置Springboot Web应用运行中DispatchServlet的初始化
- spring boot 管理bean初始化方法,以及销毁方法
- 创建springbootdemo后运行报MongoSocketOpenException错误解决方法
- 当SpringBoot以war包运行时,获取applicationContext的方法
- Spring Boot非Web项目运行配置的方法教程
- spring boot 源码解析2-SpringApplication初始化
- 将spring boot应用打入docker中运行的实现方法
- spring boot项目打成war包部署到tomcat运行的方法
- springboot项目启动执行特定方法
- STS中运行的springboot程序出现Address already in use: bind处理方法
- 知识储备:SpringBoot启动运行流程原理解析
- Spring Boot--项目启动后默认执行特定的方法