您的位置:首页 > 编程语言 > Java开发

Spring Boot 执行流程

2018-02-06 00:00 253 查看

SpringBoot执行流程

基本概述

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


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



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

SpringApplicationRunListener

SpringApplicationRunListener
SpringBoot
执行过程中,不同执行时间点时间通知的监听者,一般来说也没有必要自己实现一个
SpringApplicationRunListener
,即使是
SpringBoot
默认也只实现了一个
org.springframework.boot.context.event.EventPublishingRunListener
。通过这个类,在
SpringBoot
启动时,在不同的时间点发布不同的应用事件类型
ApplicationEvent
SpringBoot
初始化时加载的
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
给我们提供了两个接口来帮助我们实现这种需求。这两个接口分别为
CommandLineRunner
ApplicationRunner
。他们的执行时机为容器启动完成的时候。

这两个接口中有一个
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执行流程详细版

链接:https://pan.baidu.com/s/1mj2UiA8 密码:sxmz
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: