【SpringBoot】 启动后会调用执行的方法的 (五种方式)
在 SpringBoot 工程 启动后, 会调用执行方法的五种方式:
亲自测试, 按照执行顺序如下:
第一种: @Component public class SpringContext1 { @PostConstruct public void pingStart(){ System.out.println("@PostConstruc方法开始执行"); } } 第二种: @Component public class SpringContextUtils implements ApplicationContextAware { @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("implements ApplicationContextAware方法开始执行啦"); } } 第三种(会执行多次): @Component public class SpringContext2 implements ApplicationListener { @Override public void onApplicationEvent(ApplicationEvent event) { System.out.println("implements ApplicationListener方法开始执行"); } } 第四种: @Component public class SpringContext4 implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("implements ApplicationRunner"); } } 第五种: @Component public class SpringContext3 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("implements CommandLineRunner"); } }
1、测试如下:
package com.example.apidemo.java.spring; import javax.annotation.PostConstruct; import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; /* * 如果监听的是 ApplicationStartedEvent 事件,则 ApplicationListener 一定会在 CommandLineRunner 和 ApplicationRunner 之前执行; * 如果监听的是 ApplicationReadyEvent 事件,则 ApplicationListener 一定会在 CommandLineRunner 和 ApplicationRunner 之后执行; * 顺序: 默认是 ApplicationRunner 先执行,如果双方指定了@Order 则按照 @Order的大小顺序执行,小的先执行。 * 原理: * SpringApplication 的run方法会执行afterRefresh方法。 * afterRefresh方法会执行callRunners方法。 * callRunners方法会调用所有实现ApplicationRunner和CommondLineRunner接口的方法callRunners方法会调用所有实现ApplicationRunner和CommondLineRunner接口的方法 */ @Component public class SpringContact { } /*1、@PostConstruct 注解在项目初始化过程中,就会调用此方法。如果业务逻辑执行很耗时,可能会导致项目启动失败。*/ @Component class StartInit { @PostConstruct public void init() { System.out.println("1====>>>> @PostConstruct 注解的方法将在该实例化过程完成后立即执行, init 方法中的输出语句会在项目初始化过程中被调用打印"); } } /*2、实现 InitializingBean 接口,项目启动时,调用此方法*/ @Component class StartInit6 implements InitializingBean { @Override public void afterPropertiesSet() { System.out.println("2====>>>>项目启动时,调用此方法 InitializingBean "); } } /*3、实现 ApplicationListener 接口项目初始化完毕后,才会调用方法,提供服务。注意监听的事件, 通常是 ApplicationStartedEvent 或者 ApplicationReadyEvent,其他的事件可能无法注入 bean。*/ @Component class StartInit4 implements ApplicationListener<ApplicationStartedEvent> { @Override public void onApplicationEvent(ApplicationStartedEvent event) { System.out.println("3====>>>>项目初始化完毕后 调用ApplicationStartedEvent"); } } /*4、实现 ApplicationRunner 接口同 CommandLineRunner。只是传参格式不一样。 org.springframework.boot.CommandLineRunner:没有任何限制; org.springframework.boot.ApplicationRunner:key-value*/ @Component class StartInit3 implements ApplicationRunner { @Override public void run(ApplicationArguments args) { System.out.println("4====>>>>调用ApplicationRunner"); } } /*5、实现 CommandLineRunner 接口项目初始化完毕后,才会调用方法,提供服务*/ @Component class StartInit2 implements CommandLineRunner { @Override public void run(String... args) { System.out.println("5====>>>>项目初始化完毕后 调用CommandLineRunner"); } }
学海无涯 代码作伴