本文主要是介绍sprigboot初始化流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
初始化流程
过程
- 创建
SpringApplication
- 保存了一些信息
- 判定当前应用的类型,
ClassUtils.servlet
bootstrappers
:初始启动引导器(List< booterstrapper>
),去spring.factories
文件中找org.springframework.boot.Bootstrapper
- 找
ApplicationContextInitializer
初始化器:去spring.factories
文件中找ApplicationContextInitializer
List<ApplicationContextInitializer<?>> initializer
- 找
ApplicationListener
:找一个应用的监听器,去spring.factories
文件中找ApplicationListener
List< ApplicationListener<?>> listeners
- 运行
SpringApplication
StopWatch
- 记录应用的启动时间
- 创建引导上下文(Context环境)
- 获取到所有之前的
bootstrappers
挨个执行initialize()
来完成对引导启动器上下文环境设置
- 获取到所有之前的
- 让当前应用进入 headless 模式。
java.awt.headless
- 获取所有的
RunListener
(运行时监听器)【为了方便所有Listener进行时间感知】getSpringFactoriesInstances
去spring.factories
找SpringApplicationRunListener.class
- 遍历所有的
SpringApplicationRunListener
调用 starting 方法- 相当于通知所有感兴趣系统正在启动过程的人,项目正在starting。
- 保存命令行参数:
ApplicationArguments
- 准备环境
prepareEnvironment()
- 返回或创建一个基础环境信息对象:
StandardServletEnvironment
- 配置环境信息对象
- 读取所有的配置源属性值
- 绑定环境信息
- 监听器调用
listener.environmentPrepared()
,通知所有的监听器当前环境准备完成
- 返回或创建一个基础环境信息对象:
- 创建 IOC 容器:
createApplicationContext()
- 根据项目类型(Servlet)创建容器
- 当前会创建
AnnotationConfigServletWebServerApplicationContext
- 准备
ApplicationContext
IOC容器的基本信息:prepareContext()
- 保存环境信息
- IOC容器的后置处理流程
- 应用初始化器:
applyInitializers
- 遍历所有的
ApplicationContextInitializer
,调用initizlie()
,来对 IOC容器进行初始化扩展功能 - 遍历所有的
listener
调用contextPrepared
。EventPublishRunListener
通知所有监听器contextPrepared
- 遍历所有的
- 所有的监听器,调用
ContextLoaded
,通知所有的监听器contextPrepared
- 刷新IOC容器。refreshContext
- 创建容器中的所有组件
- 容器刷新文成后工作。
afterRefresh
- 所有监听器调用
listeners.started(context)
,通知所有监听器started - 调用所有的 runners。
callRunners()
- 获取容器中的
ApplicationRunner
- 获取容器中的
CommandLineRunner
- 合并所有 runner 并按照 @Order 进行排序
- 遍历所有的 runner,调用 run 方法
- 获取容器中的
- 如果以上有异常
- 调用 Listener 的 failed()
- 调用所有监听器的 running 方法
listeners.running(context)
。通知所有监听器 running - 如果running有异常
- 调用所有 Listener 的 failed()
- 通知所有监听器 failed
public interface BootStrapper{void initialize(BootstrapRegistry registry);
}
@FuncationalInterface
public interface ApplicationRunner{void run(ApplicationArguments args) throws Exception;
}
@FuncationalInterface
public interface CommandLineRunner{void run(String... args) throws Exception;
}
这篇关于sprigboot初始化流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!