SpringBoot启动流程分析
2022-03-22 17:16:12 17 举报
SpringBoot启动流程分析
作者其他创作
大纲/内容
initMessageSource()
registerListeners()
1、SpringApplication的初始化
SpringApplicationRunListeners listeners = getRunListeners(args)
拿到之前读取到所有ApplicationContextInitializer的组件,循环调用其initialize方法
执行所有 Runner 运行器
发布应用上下文就绪事件
执行所有SpringApplicationRunListener的contextPrepared方法,发布了ApplicationContextInitializedEvent事件
执行所有SpringApplicationRunListener的contextLoaded方法,发布了ApplicationPreparedEvent事件
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class))
WebApplicationType.deduceFromClasspath()
listeners.starting()
bean的实例化
ApplicationEnvironmentPreparedEvent
BeanPostProcessors的初始化
listeners.contextPrepared(context)
ConfigurableApplicationContext context = createApplicationContext()
推断当前 WEB 应用类型
设置是否允许bean的覆盖,默认不允许
ApplicationPreparedEvent
invokeBeanFactoryPostProcessors(beanFactory)
finishBeanFactoryInitialization(beanFactory)
ApplicationStartedEvent
setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding)
执行所有SpringApplicationRunListener的environmentPrepared方法,发布了ApplicationEnvironmentPreparedEvent的监听,读取全局配置文件,如:application.yml
读取配置文件
createWebServer()
从类路径下的 META-INF/spring.factories 文件解析并获取 所配置的SpringApplicationRunListener类型的类,实例化他们并放到SpringApplicationRunListeners中
initApplicationEventMulticaster()
ApplicationContextInitializedEvent
执行所有SpringApplicationRunListener的starting方法,发布了ApplicationStartingEvent的监听
refresh()
applyInitializers(context)
创建并启动Servlet容器,如启动内嵌tomcat
setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class));
BeanFactoryPostProcessors的初始化和调用
listeners.started(context)
打印banner
registerBeanPostProcessors(beanFactory)
调用容器中所有SpringApplicationRunListener的start方法
if (this.lazyInitialization) {}
执行所有SpringApplicationRunListener的running方法,发布了ApplicationReadyEvent事件
ApplicationStartingEvent
发布应用上下文启动完成事件
Spring上下文的初始化
listeners.contextLoaded(context)
根据webApplicationType,创建Spring上下文
ServletWebServerApplicationContext.onRefresh()
printBanner(environment)
Spring上下文的预初始化
ConfigurableApplicationContext run(String... args)
从类路径下的 META-INF/spring.factories 文件解析并获取 所配置的ApplicationListener类型的类,实例化他们并放到缓存池listeners中
onRefresh()
listeners.environmentPrepared(environment)
入口
从类路径下的 META-INF/spring.factories 文件解析并获取 所配置的ApplicationContextInitialize类型的类,实例化他们并放到缓存池initializers中
空方法
listeners.running(context)
refreshContext(context)
ApplicationReadyEvent
设置bean是否全局懒加载,默认fasle
2、调用SpringApplication的run方法
执行所有SpringApplicationRunListener的started方法,发布了ApplicationStartedEvent事件
new SpringApplication(primarySources).run(args)
0 条评论
下一页