【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");
    }
}

 

posted @ 2022-08-25 16:26  威兰达  阅读(4844)  评论(0编辑  收藏  举报