文章目录
一、前言介绍
在日常工作当中,我们需要在项目启动之后执行某些特定的逻辑,比如说缓存预热.、特定数据的初始化操作等
二、SpringBoot的实现方式
1.@PostConstruct
@PostConstruct
是其对应Bean装载完之后执行指定操作,不是项目启动之后,这里不做多余介绍
@Component
public class PostBean {
@PostConstruct
public void init(){
System.out.println("@PostConstruct定制化逻辑..");
}
}
2.实现CommandLineRunner接口
CommandLineRunner
是Spring Boot提供的一个接口,当你实现该接口并将之注入Spring IOC容器后,Spring Boot应用启动后就会执行其run方法。一个Spring Boot可以存在多个CommandLineRunner的实现,当存在多个时,你可以实现Ordered接口控制这些实现的执行顺序(Order 数值越大优先级越低)。接下来我们来声明两个实现并指定顺序:
@Component
public class MaxOrderCommandLineRunner implements CommandLineRunner, Ordered {
@Override
public void run(String... args) throws Exception {
System.out.println("加载特定逻辑。。。Ordered->max");
}
@Override
public int getOrder() {
return Integer.MAX_VALUE;
}
}
@Component
public class MinOrderCommandLineRunner implements CommandLineRunner, Ordered {
@Override
public void run(String... args) throws Exception {
System.out.println("加载特定逻辑。。。Ordered->min");
}
@Override
public int getOrder() {
return Integer.MIN_VALUE;
}
}
3.实现ApplicationRunner接口
在Spring Boot 1.3.0又引入了一个和CommandLineRunner功能一样的接口ApplicationRunner。CommandLineRunner接收可变参数String… args,而ApplicationRunner 接收一个封装好的对象参数ApplicationArguments。除此之外它们功能完全一样,甚至连方法名都一样。声明一个ApplicationRunner并让它优先级最低:
@Component
public class MyApplicationRunner implements ApplicationRunner, Ordered {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("实现ApplicationRunner,加载特定逻辑。。。");
}
@Override
public int getOrder() {
return 0;
}
}
4.实现ApplicationListener接口
ApplicationListener是Spring的事件机制,典型的观察者模式。实现接口ApplicationListener方式和实现ApplicationRunner,CommandLineRunner接口都不影响服务,都可以正常提供服务
@Component
public class MyApplicationListener implements ApplicationListener<ApplicationReadyEvent> {
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
System.out.println(event.getClass());
System.out.println("实现ApplicationListener,加载特定逻辑。。。");
}
}
5.实现SpringApplicationRunListener接口
和ApplicationListener类似
public class MySpringApplicationRunListener implements SpringApplicationRunListener, Ordered {
public MySpringApplicationRunListener(SpringApplication application, String[] args) {
}
@Override
public void ready(ConfigurableApplicationContext context, Duration timeTaken) {
SpringApplicationRunListener.super.ready(context, timeTaken);
// 这里可以定制化逻辑
}
@Override
public int getOrder() {
return Integer.MAX_VALUE;
}
}
src/main/resources/META-INF/spring.factories装备侦听器
org.springframework.boot.SpringApplicationRunListener=com.xmc.after.MySpringApplicationRunListener