springboot项目启动后执行方法的三种方式

网友投稿 280 2022-07-23


目录1 方法方法1:spring的ApplicationListener< ContextRefreshedEvent>接口方法2:springboot的AjOMeFIMNpplicationRunner接口方法3:springboot的CommandLineRunner接口2 指定执行顺序3 原理

springboot项目启动后执行方法,有三种实现方式。

1 方法

ApplicationListener< ContextRefreshedEvent> 不推荐ApplicationListener  推荐CommandLineRunner 推荐

方法1:spring的ApplicationListener< ContextRefreshedEvent>接口

实现ApplicationListener接口,并实现 onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent)方法

@Service

public class SearchReceive implements ApplicationListener {

@Override

public void onApplicationEvent(ContextRefreshedEvhttp://ent contextRefreshedEvent) {

if (contextRefreshedEvent.getApplicationContext().getParent() == null) {//保证只执行一次

//需要执行的方法

}

}

}

方法2:springboot的ApplicationRunner接口

ApplicationListener和CommandLineRunner两个接口是springBoot提供用来在spring容器加载完成后执行指定方法。两个接口区别主要是入参不同。

实现ApplicationRunner接口

@Component

@Order(value = 1)

public class AfterRunner implements ApplicationRunner {

@Override

public void run(ApplicationArguments args) throws Exception {

System.out.println("执行方法");

}

}

方法3:springboot的CommandLineRunner接口

实现CommandLineRunner接口

@Component

@Order(value = 2)

public class CommandLineRunnerImpl implements CommandLineRunner {

@Override

public void run(String... args) throws Exception {

System.out.println("执行方法");

}

}

注:如果同时implements   ApplicationListener和CommandLineRunner两个接口,ApplicationRunner接口的方法先执行,CommandLineRunner后执行;

@Slf4j

@Component

public class RunnerTest implements ApplicationRunner, CommandLineRunner {

@Override

public void run(ApplicationArguments args) throws Exception {

System.out.println("服务启动RunnerTest ApplicationRunner执行启动加载任务...");

}

@Override

public void run(String... args) throws Exception {

System.out.println("服务启动RunnerTest CommandLineRunner 执行启动加载任务...");

}

}

}

2 指定执行顺序

当项目中同时实现了ApplicationRunner和CommondLineRunner接口时,可使用Order注解或实现Ordered接口来指定执行顺序,值越小越先执行。

3 原理

SpringApplication 的run方法会执行afterRefresh方法。

afterRefresh方法会执行callRunners方法。

callRunners方法会调用所有实现ApplicationRunner和CommondLineRunner接口的方法。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java servlet通过事件驱动进行高性能长轮询详解
下一篇:Java递归查找层级文件夹下特定内容的文件的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~