文章目录
- 1. 简介
- 2. 用法
- 1)单个 CommandLineRunner
- 2)多个 CommandLineRunner
- 3. 优点
- 4. 缺点
- 总结
CommandLineRunner
是 Spring Boot 提供的一个接口,用于在 Spring Boot 应用程序启动后执行一些任务。通过实现 CommandLineRunner
接口,我们可以在应用程序启动时执行一些初始化操作,例如加载初始数据、建立连接,或者执行其他的启动任务。
1. 简介
CommandLineRunner
接口定义了一个单一的 run
方法,该方法会在应用程序启动后被调用。可以将多个 CommandLineRunner
实例注册到 Spring Boot 应用程序中,它们会按照注册的顺序依次执行。
源码如下
2. 用法
1)单个 CommandLineRunner
要实现 CommandLineRunner
接口,只需要实现它的 run
方法。
下面是一个简单的例子:
DemoCommandLineRunner.java
package com.cheney.demo;import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class DemoCommandLineRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("Hello CommandLineRunner");}
}
在上述代码中,DemoCommandLineRunner
类实现了 CommandLineRunner
接口,并在 run
方法中编写了打印 Hello CommandLineRunner 的代码。这个任务会在应用程序启动时执行。
启动类
package com.cheney.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
执行结果:
2)多个 CommandLineRunner
可以同时注册多个 CommandLineRunner
实例,并通过 @Order
注解或 Ordered
接口来指定它们的执行顺序。
下面是一个简单的例子:
DemoCommandLineRunner.java
package com.cheney.demo;import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;@Component
@Order(1)
public class DemoCommandLineRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("Hello CommandLineRunner");}
}
Demo2CommandLineRunner.java
package com.cheney.demo;import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;@Component
@Order(2)
public class Demo2CommandLineRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("Hello CommandLineRunner 2");}
}
在上述代码中,DemoCommandLineRunner
和 Demo2CommandLineRunner
分别标注了 @Order(1)
和 @Order(2)
,指定了它们的执行顺序。如果不使用 @Order
注解,可以实现 Ordered
接口来设置顺序。
执行结果:
3. 优点
-
简单方便
CommandLineRunner
的设计目标是简化应用程序启动时的初始化工作,开发者只需实现run
方法,将需要在启动时执行的逻辑放在其中即可,非常方便。 -
与 Spring Boot 协同工作
CommandLineRunner
是 Spring Boot 提供的标准接口之一,与 Spring Boot 的自动配置和生命周期机制协同工作,确保在应用程序启动时执行初始化任务。 -
多任务支持
应用程序可以同时注册多个
CommandLineRunner
实例,通过@Order
注解或实现Ordered
接口,可以指定它们的执行顺序,灵活支持多任务的初始化需求。
4. 缺点
-
仅适用于 Spring Boot
CommandLineRunner
是 Spring Boot 提供的特定接口,因此仅适用于基于 Spring Boot 的应用程序。如果应用程序不使用 Spring Boot,这种方式可能不够适用。 -
局限于启动时执行
CommandLineRunner
主要用于在应用程序启动时执行任务,如果需要其他触发点或更细粒度的控制,可能需要考虑其他方式。 -
无法传递参数
CommandLineRunner
的run
方法不接受参数,因此在运行时动态地传递参数可能会有些困难。如果需要更灵活的参数传递方式,可能需要考虑其他方式,如使用配置文件、环境变量等。
总结
CommandLineRunner
接口是 Spring Boot 中用于执行应用程序启动任务的一种方便的方式。通过实现这个接口,我们可以在应用程序启动时执行初始化操作,确保应用程序在启动后处于正确的状态。