1.添加pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2. 初始化启动类
CommandLineRunner 与 ApplicationRunner 都是初始化任务类,两者的区别主要在参数上。CommandLineRunner 只能处理参数值,是一个字符串数组进行接收,ApplicationRunner 对参数进行了封装处理,可以通过参数名进行参数值获取。
ApplicationRunner 执行结果:
@Component
public class ApplicationRun implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("sourceArgs:: "+ Arrays.asList(args.getSourceArgs()));
System.out.println("nonOptions::"+args.getNonOptionArgs());
System.out.println("optionNames::"+args.getOptionNames());
System.out.println("param::"+ args.getOptionValues("param"));
System.out.println("name::"+ args.getOptionValues("name"));
System.out.println("hello::"+ args.getOptionValues("hello"));
}
}
CommandLineRunner 执行结果:
@Component
public class AbRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("===========CommandLineRunner============");
System.out.println(Arrays.asList(args));
System.out.println("The Runner start to initialize ...");
}
}
3. 初始化执行顺序
ApplicationRunner 优先于CommandLineRunner 加载,如果需要指定加载顺序,使用注解@Order(1)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Documented
public @interface Order {
int value() default 2147483647;
}
Order 默认按照从小到大的顺序进行加载
执行顺序结果:
4. 源码加载顺序
总结:当需要在系统启动时,进行初始化工作时,可以使用ApplicationRunner 或CommandLineRunner进行,侧重点是对参数处理不一样。