如何在springboot启动之后执行一段逻辑?
不知道这个问题你思考过没???或者实际业务场景中有这种诉求没?实际业务场景中我们可能接到这种业务需求:项目启动后立即执行一段逻辑,比如简单的缓存预热,数据的初始化。
如果你使用了springboot那么可以借助其提供的接口CommandLineRunnerApplicationRunner来实现。
org。springframework。boot。CommandLineRunner是SpringBoot提供的一个接口,当你实现该接口并将之注入SpringIoC容器后,SpringBoot应用启动后就会执行其run方法。一个SpringBoot可以存在多个CommandLineRunner的实现,当存在多个时,你可以实现Ordered接口控制这些实现的执行顺序(Order数值越大优先级越低)。接下来我们来声明两个实现并指定顺序:
下面让我们通过代码实例来看看如何执行的。
首先构造两个类,并加入容器:Slf4jComponentpublicclassHighOrderCommandLineRunnerimplementsCommandLineRunner,Ordered{Overridepublicvoidrun(String。。。args)throwsException{log。info(Highcommandrun。。。。。。。);}OverridepublicintgetOrder(){return0;}}Slf4jComponentpublicclassLowOrderCommandLineRunnerimplementsCommandLineRunner,Ordered{Overridepublicvoidrun(String。。。args)throwsException{log。info(lowcommandrun。。。);}OverridepublicintgetOrder(){return1;}}
启动项目查看打印日志顺序2022011911:52:47。274INFO31250〔main〕o。s。b。w。embedded。tomcat。TomcatWebServer:Tomcatstartedonport(s):8090(http)withcontextpath2022011911:52:47。344INFO31250〔main〕com。io。jdkweb。JdkWebApplication:StartedJdkWebApplicationin2。879seconds(JVMrunningfor3。34)2022011911:52:47。355INFO31250〔main〕c。i。j。c。i。HighOrderCommandLineRunner:Highcommandrun。。。。。。。2022011911:52:47。356INFO31250〔main〕c。i。j。c。i。LowOrderCommandLineRunner:lowcommandrun。。。
可以看到项目启动之后,自动就执行了,刚好满足了我们的需求,容器启动之后自动帮我们调用,前提类需要加入到容器中并实现接口。
下一节,我们来探讨另外一种更常用的项目启动之后需要执行的初始化逻辑的变种实现