SpringBoot 启动流程最新版 2.4.3版本
2021-03-10 14:05:45 1 举报
SpringBoot 启动流程最新版 2.4.3版本
作者其他创作
大纲/内容
初始化,注入属性
清除上下文级别资源缓存clearResourceCaches
setApplicationStartup(this.applicationStartup);设置应用启动默认变量
1.先判断注册registerShutdownHook应用停止做一些关闭操作
4.广播contextPrepared事件
发布ContextRefreshedEvent
2. 调用传入的contextrefresh方法
callRunners暴露的启动,调用
最后步骤finishRefresh
1.循环所以processors对BeanDefinitionRegistryPostProcessor执行postProcessBeanDefinitionRegistry在下一个后处理阶段开始之前添加更多的bean定义。
createBootstrapContext为springcloud预留的
2. ClassUtils.class.getClassLoader();
configureHeadlessProperty();配置java.awt.headless 属性,允许无显示器启动
根据类型创建AnnotationConfigServletWebServerApplicationContext
在特定上下文子类中初始化其他特殊bean。
这中间做了很多代理处理,也是为什么前面需要冻结
这里springboot改写包含初始化主题功能和创建webserver
stopWatch.start();SpringUtil自己的计时
prepareContext准备上下文
4. 存储预刷新的监听器
11. load 加载源的BeanDefinition注册到reader中
添加额外的Profiles
4.循环遍历每个Properties 把key作为key将value使用StringUtils.commaDelimitedListToStringArray拆分将拆分的每个元素加入value list中
这边其实就是一个EventPublishingRunListener作为事件的代理,实际还是调用ApplicationListener
默认注入是null,因此不会使用这个classLoader
getRunListeners获取SpringApplicationRunListeners
检测织入LoadTimeWeaver
与前面一样注册BeanPostProcessors
1.首先先从cache获取
首先对 非抽象 单例 非延迟初始化
这里调用了EnvironmentPostProcessor
工厂创建后处理postProcessBeanFactory
先调用生命周期处理器,优先刷新getLifecycleProcessor().onRefresh()
广播EnvironmentPrepared事件
afterRefresh模板方法,后置调用(空)
把 configurationProperties加到环境中ConfigurationPropertySources.attach
根据web类型创建 StandardServletEnvironment
主类class
最后直接调用其他的没有排序的
3. ClassLoader.getSystemClassLoader();
初始化MessageSource国际化等
3.验证环境中的必须属性是否存在
3. createSpringFactoriesInstances
1.调用委托类后置处理器调用postProcessorPostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
发生beansexception
先分批调用 postProcessBeanDefinitionRegistry
SharedMetadataReaderFactoryContextInitializer
初始化当前 ApplicationContext 的事件广播器
4.从加载的Map中获取需要的NameList没有返回emptyList
这里调用的其实就是AbstractApplicationContext的refresh方法
new DefaultApplicationArguments(args);封装应用入参
1.创建DefaultBootstrapContext
prepareEnvironment
1.如果前面classloader为null 使用SpringFactoriesLoader.class.getClassLoader();
1. Thread.currentThread().getContextClassLoader();
1. getClassLoader();
也是子类实现注册了WebApplicationContextServletContextAwareProcessor注册了应用scope registerWebApplicationScopes
3.遍历每个ApplicationContextInitializer对上下文初始化
9.判断是否延迟初始化是则添加LazyInitializationBeanFactoryPostProcessor
然后通过getSingleton获取所有实例判断 SmartInitializingSingleton 类型执行后置 afterSingletonsInstantiated
启动
准备 Environment包括系统参数之类的
1.先 BeanDefinitionScanner 清除缓存
优先调用实现 Ordered 的 先排序后调用
向刚才初始的广播器注册ApplicationListener
refreshBeanFactorygetBeanFactory
把环境绑定SpringApplication
关键类ConfigurationClassPostProcessor实现了自动配置注入
优先注册LoadTimeWeaverAware(此处没有)
停止使用临时的ClassLoader进行类型匹配
refreshContext核心:刷新上下文
从上到下获取,获取到返回,没有返回null
发生异常到失败
5.bootstrapContext广播BootstrapContextClosedEvent
handleRunFailure处理启动失败
这里根据AnnotationAwareOrderComparator 静态方法(单例)排序
4. AnnotationAwareOrderComparator.sort
8.判断是否是DefaultListableBeanFactory设置是否允许bean定义覆盖默认是不允许
stopWatch.stop();停止计时
printBanner(environment);打印banner
2. ClassUtils.getDefaultClassLoader();
2. 使用每个bootstrappers初始化 bootstrapContext上下文然后返回bootstrapContext上下文
准备刷新的一些操作prepareRefresh();
这里就是根据获取的类用反射创建实例
实例化全部的SpringApplicationRunListener
广播starting 事件
2. 根据type getName
调用子类实现obtainFreshBeanFactory
Bootstrapper
销毁创建的bean重置active标识
web应用类型
BeanDefinitionRegistry
优先调用实现 PriorityOrdered 的 先排序后调用
准备工厂prepareBeanFactory
两种后置调用接口,区别在于传参不同ApplicationRunnerCommandLineRunner
logStartupInfo判断打印启动信息,多少秒什么端口之类的
listeners.started(context);广播 started 事件
3. loadSpringFactories(classLoader)
this.resourceLoader = null
return context;最后返回创建的上下文
添加beanFactory一些属性:1.设置classloader2.设置spel解析3.添加属性编辑注册器4.添加部分 beanPostProcessor5.忽略自动注入的bean6.注入自己依赖的bean7.注册基础的环境bean
6. 最后把map存入chache 返回result
检测注入ConversionService
调用工厂处理器注册进上下文invokeBeanFactoryPostProcessors
把defaultProperties添加到最后DefaultPropertiesPropertySource.moveToEnd
configureIgnoreBeanInfo设置这个属性默认为true,为false启动时与延迟加载性能差
最后一步完成实例化
new SpringApplication(primarySources)创建应用实例
.run(args)
ApplicationListener
将所有的beanDefinitionNames缓存/冻结进入frozenBeanDefinitionNames
源class primarySources
listeners.running(context);广播running 事件
5.把map中索引key 替换成不可更改List
1.注入environment
其中分了两大类:factoryBean普通bean其中factoryBena再分了急切初始化bean,使用普通方法getBean初始化了
2.通过classloader获取META-INF/spring.factories 的urls
2. 在上下文环境中初始化任何占位符属性源
finally代码块把前面的缓存清除
getSpringFactoriesInstances
配置命令行属性进入环境配置profiles 这里是个空实现configureEnvironment
ApplicationContextInitializer
实例化剩余非延迟单例对象finishBeanFactoryInitialization
后面再对所有的processor调用同样遵循先PriorityOrdered 再 Ordered 再其他BeanFactoryPostProcessor的postProcessBeanFactory
再attach一下返回
GenericApplicationContextfont color=\"#ff3399\
为上下文初始化生命周期处理器initLifecycleProcessor
1. this.resourceLoader.getClassLoader();
createApplicationContext创建应用上下文
收藏
0 条评论
回复 删除
下一页