关于CommandLineRunner的使用详解
作者:LBL_lin
本文介绍了如何在SpringBoot项目启动时使用CommandLineRunner和ApplicationRunner接口进行数据预加载或操作,通过实现这两个接口,可以在项目启动时执行特定的任务,同时,还展示了如何使用@Order注解来控制多个实现类的加载顺序
背景
在项目启动时需要做一些数据预加载或者某些操作,需要怎么办呢,方法其实有好几种,这里主要讲一下SpringBoot提供的CommandLineRunner接口的使用。
案例说明以及实现
1.实现CommandLineRunner接口
- 定义一个类实现CommandLineRunner接口,模拟启动项目时的预加载处理。
package com.lbl.run; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Slf4j @Component public class WebStart implements CommandLineRunner { @Override public void run(String... args) throws Exception { log.info("------------- WebStart ---------------"); } }
- 启动类
package com.lbl; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @Slf4j @SpringBootApplication public class SpringbootDemoApplication { public static void main(String[] args) { log.info("------------- before ---------------"); SpringApplication.run(SpringbootDemoApplication.class, args); log.info("------------- after ---------------"); } }
- 启动启动类,查看日志的打印
2.加载的顺序
- 如果有多个实现类,我们可以使用@Order()注解控制它们的加载顺序,数字越小加载越早。
- 现在创建多一个CommandLineRunnerd的实现类,给它们加上@Order()注解。
package com.lbl.run; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Slf4j @Component @Order(2) public class WebStart implements CommandLineRunner { @Override public void run(String... args) throws Exception { log.info("------------- WebStart ---------------"); } }
package com.lbl.run; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Slf4j @Component @Order(1) public class WebStart2 implements CommandLineRunner { @Override public void run(String... args) throws Exception { log.info("------------- WebStart2 ---------------"); } }
- 启动启动类,查看日志的打印
3.扩展-ApplicationRunner
- 除了实现CommandLineRunner接口可以完成项目启动时的预加载动作,还有ApplicationRunner也能实现同样的功能,并且在不设置@Order()的情况下,ApplicationRunner的优先级大于CommandLineRunner。
package com.lbl.run; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; @Slf4j @Component public class WebStart3 implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { log.info("------------- WebStart3 ---------------"); } }
此时注掉前面两个实现类的@Order()注解
- 启动实现类,查看日志的打印
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。