ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、简介 Spring Boot提供了两个接口:CommandLineRunner、ApplicationRunner,用于启动应用时做特殊处理,这些代码会在SpringApplication的run()方法运行完成之前被执行。 通常用于应用启动前的特殊代码执行、特殊数据加载、垃圾数据清理、微服务的服务发现注册、系统启动成功后的通知等。相当于Spring的ApplicationListener、Servlet的ServletContextListener。**使用二者的好处在于,可以方便的使用应用启动参数**,根据参数不同做不同的初始化操作。 ## 二、代码小实验 ### 通过@Component定义方式实现 CommandLineRunner:参数是字符串数组 ~~~ @Slf4j @Component public class CommandLineStartupRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { log.info("CommandLineRunner传入参数:{}", Arrays.toString(args)); } } ~~~ ApplicationRunner:参数被放入ApplicationArguments,通过getOptionNames()、getOptionValues()、getSourceArgs()获取参数 ~~~ @Slf4j @Component public class AppStartupRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { log.info("ApplicationRunner参数名称: {}", args.getOptionNames()); log.info("ApplicationRunner参数: {}", args.getSourceArgs()); } } ~~~ ![](https://img.kancloud.cn/b1/f9/b1f900213dff57b2bf4dcb8ead8e4363_442x149.png) 在项目启动时就能看到,这两个方法已经启动 ![](https://img.kancloud.cn/58/09/580968bd1cfc9d79cd9b3ad0114eed4f_1619x104.png) ### 通过@Bean定义方式实现 ~~~ @Configuration public class BeanRunner { @Bean @Order(1) public CommandLineRunner runner1(){ return new CommandLineRunner() { public void run(String... args){ System.out.println("CommandLineRunner run1()" + Arrays.toString(args)); } }; } @Bean @Order(2) public CommandLineRunner runner2(){ return new CommandLineRunner() { public void run(String... args){ System.out.println("CommandLineRunner run2()" + Arrays.toString(args)); } }; } @Bean @Order(3) public CommandLineRunner runner3(){ return new CommandLineRunner() { public void run(String... args){ System.out.println("CommandLineRunner run3()" + Arrays.toString(args)); } }; } } ~~~ 可以通过@Order设置执行顺序 ![](https://img.kancloud.cn/a1/57/a157d5a45900fdae6c869161b4b58268_1777x246.png) ## 三、执行测试 ![](https://img.kancloud.cn/57/c1/57c1952d60191b056aab9b5e8c0ba0de_717x381.png) ![](https://img.kancloud.cn/23/3b/233b6a9dcf18658e8412ae977fe79588_1716x1022.png) 重启服务,会看到参数传入 ![](https://img.kancloud.cn/6a/18/6a180045d2e9485501753624a3e83856_1735x124.png) ## 四、总结 CommandLineRunner、ApplicationRunner的核心用法是一致的,就是用于应用启动前的特殊代码执行。ApplicationRunner的执行顺序先于CommandLineRunner;CommandLineRunner只是将对象按照原样显示出来,ApplicationRunner将参数封装成了对象,提供了获取参数名、参数值等方法,操作上会方便一些。 另外可以通过@Order定义执行的书序。 这个方法可以在程序启动时传入初始化的参数或者操作,将参数或者方法写在里面达到初始化程序的操作。