1. 使用场景
在项目服务启动的时候就去加载一些数据或者做一些批处理
如果是批处理的话,可以将项目打成jar包
,供其他程序调用
2. 原理
Spring Boot应用程序在启动后,会从容器中遍历实现了CommandLineRunner
接口的实例并运行它们的run方法,所以实现CommandLineRunner的类需要添加@Component
等注解。如果有多个类实现了CommandLineRunner接口的话,也可以利用@Order
注解来规定所有CommandLineRunner实例的运行顺序。
3.实现
⏹定义接口
public interface IMethod {
void run();
}
⏹接口实现类
// 给bean取别名
@Component("batchA")
public class Batch1 implements IMethod {
public void run() {
System.out.println("Batch1执行了");
}
}
// 给bean取别名
@Component("batchB")
public class Batch2 implements IMethod {
public void run() {
System.out.println("Batch2执行了");
}
}
⏹CommandLineRunner 接口的实现类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
// 实现CommandLineRunner接口的类需要添加@Component等注解,把实现类放到Spring容器中
@Component
public class ParamExecute1 implements CommandLineRunner {
// 注入ApplicationContext对象,获取容器中的Bean
@Autowired
private ApplicationContext applicationContext;
// args为从控制台传入的参数
public void run(String... args) throws Exception {
if (ObjectUtils.isEmpty(args)) {
System.out.println("_/_/_/_/_/_/_/_/_/_/_/_/_/");
System.out.println("请传入参数");
return;
}
// 获取传入的第一个参数(参数值和IMethod接口实现类的别名要相同)
String arg = args[0];
try {
// 根据Bean名称和IMethod接口获取到实现了IMethod接口的实现类对象
IMethod bean = applicationContext.getBean(arg, IMethod.class);
bean.run();
} catch (Exception e) {
System.out.println("_/_/_/_/_/_/_/_/_/_/_/_/_/");
System.out.println("请传入正确的参数");
}
}
}
⏹打包为jar包之后,控制台调用
参考资料
1.https://blog.csdn.net/cx1110162/article/details/87866633
2.https://www.cnblogs.com/lucky9322/p/13289751.html