在开发时,一般都有这样的需求,在服务启动完成后,自动执行某个动作。SpringBoot提供了CommandLineRunner和ApplicationRunner接口。我们先看看源码:
public interface CommandLineRunner {
void run(String... args) throws Exception;
}
public interface ApplicationRunner {
void run(ApplicationArguments args) throws Exception;
}
可以看出他们都提供了一个run(), 只是方法的参数不同而已。下面我们看看他们的应用。
@Component
public class MyCommandLineRunner implements CommandLineRunner, Ordered {
@Override
public void run(String... args) throws Exception {
System.out.println("this is MyCommandLineRunner");
}
@Override
public int getOrder() {
return 0;
}
}
@Component
@Order(9)
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("MyApplicationRunner");
}
}
就这么简单,这里要说的是,当一个项目中有多个类似这样的需求,并且这些需求执行顺序是有要求的,那么我们可以使用@Order注解,或者实现Ordered接口。@Order主机里面的值,是执行的优先级,数字越小,越先执行。如果没有指定数字值时,此时,是随机执行的。下面看看@Order注解的代码:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Documented
public @interface Order {
int value() default 2147483647;
}
我们看到,默认值是整数的最大值。ok,就到这里吧。