SpringBoot执行流程

基本概述

SpringBoot将spring应用的启动流程进行了一个“模板化”的操作,所以我们才能通过SpringApplication.run(XXX.class, args)的方式来进行一站式的启动。其内部逻辑也是个较复杂的过程,下文将对执行流程进行阐述。本流程参考的SpringBoot版本为1.4.3.RELEASE。

SpringBoot应用启动步骤简要示意图

这里写图片描述
通过上面这个简要示意图,可以看出,只要将事件通知的扩展点忽略,SpringBoot的执行流程并不是想象中那么复杂。

SpringApplicationRunListener

SpringApplicationRunListenerSpringBoot执行过程中,不同执行时间点时间通知的监听者,一般来说也没有必要自己实现一个SpringApplicationRunListener,即使是SpringBoot默认也只实现了一个org.springframework.boot.context.event.EventPublishingRunListener。通过这个类,在SpringBoot启动时,在不同的时间点发布不同的应用事件类型ApplicationEventSpringBoot初始化时加载的ApplicationListener如果对这些事件感兴趣,则可以接收并处理。

public interface SpringApplicationRunListener {
    void started();
    void environmentPrepared(ConfigurableEnvironment environment);
    void contextPrepared(ConfigurableApplicationContext context);
    void contextLoaded(ConfigurableApplicationContext context);
    void finished(ConfigurableApplicationContext context, Throwable exception);
}

ApplicationContextInitializer

通过这个类,可以在ApplicationContext调用refresh()方法前,对ApplicationContext对象做进一步的设置或者处理。

public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {
    void initialize(C applicationContext);
}

ApplicationRunner和CommandLineRunner

我们在开发中可能会有这样的情景。需要在容器启动的时候执行一些内容。比如读取配置文件,数据库连接之类的。SpringBoot给我们提供了两个接口来帮助我们实现这种需求。这两个接口分别为CommandLineRunnerApplicationRunner。他们的执行时机为容器启动完成的时候。

这两个接口中有一个run方法,我们只需要实现这个方法即可。这两个接口的不同之处在于:ApplicationRunner中run方法的参数为ApplicationArguments,而CommandLineRunner接口中run方法的参数为String数组。

如果有多个实现类,而你需要他们按一定顺序执行的话,可以在实现类上加上@Order注解。@Order(value=整数值)SpringBoot会按照@Order中的value值从小到大依次执行。

ApplicationRunner

public interface ApplicationRunner {
    void run(ApplicationArguments args) throws Exception;
}

CommandLineRunner

public interface CommandLineRunner {
    void run(String... args) throws Exception;
}

SpringBoot执行流程详细版

这里写图片描述


Spring Boot 生命周期

application.properties中,添加:

context.listener.classes=com.example.listener.ApplicationEventListener

实现ApplicationListener接口:


public class ApplicationEventListener implements ApplicationListener {

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        // 在这里可以监听到Spring Boot的生命周期
        if (event instanceof ApplicationEnvironmentPreparedEvent) { // 初始化环境变量 }
        else if (event instanceof ApplicationPreparedEvent) { // 初始化完成 }
        else if (event instanceof ContextRefreshedEvent) { // 应用刷新 }
        else if (event instanceof ApplicationReadyEvent) {// 应用已启动完成 }
        else if (event instanceof ContextStartedEvent) { // 应用启动,需要在代码动态添加监听器才可捕获 }
        else if (event instanceof ContextStoppedEvent) { // 应用停止 }
        else if (event instanceof ContextClosedEvent) { // 应用关闭 }
        else {}
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值