初始化流程
过程
-
创建
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;
}
版权声明:本文为sprintline原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。