在开发中可能会有这样的情景。需要在容器启动的时候执行一些内容。比如读取配置文件,数据库连接,netty-socketio服务启动。SpringBoot给我们提供了两个接口来帮助我们实现这种需求。这两个接口分别为CommandLineRunner
和ApplicationRunner
。他们的执行时机为容器启动完成的时候。
使用
这两个接口中有一个run
方法,我们只需要实现这个方法即可。这两个接口的不同之处在于:ApplicationRunner中run方法的参数为ApplicationArguments
,而CommandLineRunner接口中run方法的参数为String数组
。目前我在项目中用的是CommandLineRunner。是这么实现的:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
| jav@Component @Slf4j public class StartRunner implements CommandLineRunner {
@Autowired SocketIOServer socketIOServer;
@Override public void run(String... args) throws Exception { log.info("开始启动socketIOServer"); socketIOServer.start(); log.info("socketIOServer完成"); } }
|
在SpringBoot项目启动完成的时候,执行该类的run方法,从而调用执行了SocketIO服务的启动。

执行顺序
run方法的执行顺序是按照顺序执行的,如果我们想要每个要启动的服务按照某种顺序执行,则可以将要先执行的服务写在前面。当然也提供了相关注解的方式,保证CommandLineRunner和ApplicationRunner的实现类按照指定的顺序执行。
其一可以在实现类上加上@Order注解指定执行的顺序;其二可以在实现类上实现Ordered接口来标识。
需要注意:数字越小,优先级越高,也就是@Order(1)注解的类会在@Order(2)注解的类之前执行。
CommandLineRunnerBean1.java
1 2 3 4 5 6 7
| @Component @Order(1) public class CommandLineRunnerBean1 implements CommandLineRunner { public void run(String... args) { System.out.println("CommandLineRunnerBean 1"); } }
|
ApplicationRunnerBean1.java
1 2 3 4 5 6 7 8
| @Component @Order(2) public class ApplicationRunnerBean1 implements ApplicationRunner { @Override public void run(ApplicationArguments arg0) throws Exception { System.out.println("ApplicationRunnerBean 1"); } }
|
CommandLineRunnerBean2.java
1 2 3 4 5 6 7
| @Component @Order(3) public class CommandLineRunnerBean2 implements CommandLineRunner { public void run(String... args) { System.out.println("CommandLineRunnerBean 2"); } }
|
ApplicationRunnerBean2.java
1 2 3 4 5 6 7 8
| @Component @Order(4) public class ApplicationRunnerBean2 implements ApplicationRunner { @Override public void run(ApplicationArguments arg0) throws Exception { System.out.println("ApplicationRunnerBean 2"); } }
|
输出结果为:
1 2 3 4
| CommandLineRunnerBean 1 ApplicationRunnerBean 1 CommandLineRunnerBean 2 ApplicationRunnerBean 2
|
参考文章
https://blog.csdn.net/jdd92/article/details/81053404?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-5.control
https://blog.csdn.net/zongzhankui/article/details/78681942