再应用程序开发过程中,往往我们需要在容器启动的时候执行一些操作。
Spring Boot中提供了CommandLineRunner和ApplicationRunner两个接口来实现这样的需求。
1、不同
参数不同,其他大体相同,可根据实际需求选择合适的接口使用。
CommandLineRunner接口中run方法的参数为String数组,ApplicationRunner中run方法的参数为ApplicationArguments。
2、使用场景
在启动项目时,有时候我们所做的操作可能不是一次性的操作,有可能循环查询数据库,根据结果来处理不同的业务,亦或是监听消息队列……
3、坑
用runner来开启socket监听,但是后续其他的初始化等都未执行,是因为启动CommandLineRunner的执行其实是整个应用启动的一部分,没有打印最后的启动时间,说明项目是在CommandLineRunner执行完成之后才启动完成的。
后续多个runner无法执行
4、解决
在实现方法里新建一个线程来开启socket监听
此时CommandLineRunner执行的操作和主线程是相互独立的,抛出异常或则阻塞并不会影响到主线程。