7. Spring Boot - 启动流程和自动装配原理(详细)
2021-04-14 00:43:58 0 举报
Spring Boot的启动流程和自动装配原理
作者其他创作
大纲/内容
EventPublishingRunListener.contextLoaded将ApplicationListener添加至Context中向ApplicationListeners广播ApplicationPreparedEvent事件
run(args)
从context中获取ApplicationRunner和CommandLineRunner进行order排序后调用其run方法
printBanner(environment) 打印banner
AutoConfigurationImportSelector
listeners.running
context = createApplicationContext()
// TODO
SpringBoot默认只有EventPublishingRunListener这一个Listener,用于广播事件
保存primarySources推测webApplicationType和mainApplicationClass并保存
setInitializers / setListeners
new SpringApplication(primarySources)
SpringBoot自动装配原理
读取META-INF/spring.factories并将读取到的内容放入SpringFactoriesLoader的cache中
获取 exceptionReporters
listeners.started(context)
listeners.contextLoaded(context)
environment = prepareEnvironment
获取异常报导器SpringBootExceptionReporter我们也可以自定义自己的报导器通过spring.factories注册进去
prepareContext
根据之前推测出的webApplicationType创建Context
此时会对所有实现了ApplicationContextAware的ApplicationListener设置context
return context
EventPublishingRunListener通过context广播ApplicationReadyEvent事件
一些参数设置和单例Bean的注入
根据读取到的配置文件创建ApplicationContextInitializer和ApplicationListener实例
根据读取到的配置文件创建所有的SpringApplicationRunListener并执行它们EventPublishingRunListener会对之前保存的ApplicationListeners发送一次starting事件的广播
EventPublishingRunListener通过context广播ApplicationStartedEvent事件注意:此时已基于context广播
applicationContext.refresh()刷新容器此时会触发自动装配
applyInitializers(context);
refreshContext
调用SpringApplicationRunListener的contextPrepared方法此时EventPublishingRunListener向所有ApplicationListeners广播ApplicationContextInitializedEvent事件
准备Context阶段调用所有ApplicationContextInitializer的initialize方法
SpringFactoriesLoader.loadFactoryNames
创建环境信息EventPublishingRunListener向Listeners广播一次ApplicationEnvironmentPreparedEvent事件
将之前保存的primarySources作为sources创建BeanDefinitionLoader注册primarySources的Bean定义
listeners.contextPrepared(context);
SpringApplicationRunListeners.starting()
main(String[] args)
注意:刷新容器前会注册ShutdownHook,用于在进程结束前调用doClose方法,此时会发送ContextClosedEvent事件并销毁所有单例Bean
0 条评论
回复 删除
下一页