Spring boot全流程启动+配置+核心原理
2021-09-01 22:05:18 0 举报
Spring boot相关全流程
作者其他创作
大纲/内容
③事件多播器contextPrepared:初始化
BeanDefinitionRegistry注册Bean
是
获取所有配置类
Resource定义生成BeanDefinition
处理类上所有@PropertySource
创建ApplicationContext
排序
③Spring事件多播器 初始化 和 事件发布
BootstrapApplicationListener 监听了 environmentPrepared环境准备事件:1)通过在单独的引导上下文中委托 ApplicationContextInitializer bean 来准备 SpringApplication(例如填充其环境)的侦听器。 bootstrap 上下文是从 spring.factories 中定义为 BootstrapConfiguration(处理所有BootstrapConfiguration自动配置类,在spring.factories中定义的自动配置类,如加载vault的VaultBootstrapPropertySourceConfiguration、加载consul的ConsulConfigBootstrapConfiguration) 的源创建的 SpringApplication,并使用取自“bootstrap.properties”(或 yml)的外部配置进行初始化,而不是普通的“application.properties”。
ApplicationContext级别bean的postProcess
StubPropertySource
ApplicationStartingEvent 启动
environmentPrepared
将String解析成Resource
include
否
Main Application
创建bootstrap环境
④环境准备
②SpringFactoriesLoader加载SpringApplicationRunListener
此处判断,避免Bootstrap SpringAppliction启动过程中也发布了环境准备事件,再次触发新的Appliction启动,导致死循环
12、finishRefresh
①初始化SpringAppliction对象
StubPropertySource:servletConfigInitParams
③事件多播器初始化
处理@ImportResource
处理配置类processConfigBeanDefinitions
应用程序类启动类加载器
1)注册事件多播器
①new SpringApplication()
包及其子包下的Bean生成BeanDefinition
Main SpringApplication添加CloseContextOnFailureApplicationListener监听failed事件
执行所有ApplicationRun按照顺序排序
执行所有ApplicationContextInitializer的initialize方法
1)初始化一些属性设置;子类自定义个性化的属性设置方法; 2)检验必要属性 3)初始化保存容器中的一些早期事件的LIst(当事件多播器还没初始化,但是有事件发布)
作用:当Main SpringAppliction 发出failed事件,此监听器将close BootStrapSpringAppliction此监听器持有BootStrapSpringAppliction实例
10、registerListeners
③事件多播器running:运行
其他事件
处理延时处理ImportDeferredImportSelector类型
spring.cloud.bootstrap.enabled
处理类上所有@ComponentScans
⑧-⑤处理配置类
事件监听:给事件多播器使用List<ApplicationListener<?>>
扫描包及其子包
⑧refresh 重点:刷新容器
run()
1)空实现:给子类扩展用,在BeanFactory准备工作完成后做一些定制化的处理
2、obtainFreshBeanFactory
8、initApplicationEventMulticaster
SimpleApplicationEventMulticaster事件多播器,包含SpringApplication中的所有ApplicationListener
9、onRefresh
③事件多播器started:启动
⑧Refresh流程
MapPerpertySource:systemProperties
获取默认环境
ApplicationPreparedEvent context准备
创建bootstrap
先执行BeanDefinitionRegistryPostProcessor 1)、获取所有的BeanDefinitionRegistryPostProcessor; 2)、看先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor、 postProcessor.postProcessBeanDefinitionRegistry(registry) 3)、在执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor; postProcessor.postProcessBeanDefinitionRegistry(registry) 4)、最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors; postProcessor.postProcessBeanDefinitionRegistry(registry) 再执行BeanFactoryPostProcessor的方法 1)、获取所有的BeanFactoryPostProcessor 2)、看先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor、 postProcessor.postProcessBeanFactory() 3)、在执行实现了Ordered顺序接口的BeanFactoryPostProcessor; postProcessor.postProcessBeanFactory() 4)、最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor; postProcessor.postProcessBeanFactory()
类加载器 == null?
ClassPathBeanDefinitionScanner.doScan()
exclude
合并BootstrapApplictionApplicationContextInitializer到Main SpringApplictionApplicationContextInitializer
StubPropertySource:servletContextInitParams
1)Bean名称的生成器(如果有则配置)2)Bean的ResourceLoad(如果有则配置)3)Bean的ConversionService:默认配置为ApplicationConversionService
加载 Resource 资源
⑤BootstrapApplication 启动
ApplicationStartedEvent context启动
事件发布的Application 环境PropertySources中是否包含bootstrp属性:是否已经是BootstrapAppliction
running
4、postProcessBeanFactory
ApplicationContextInitializedEvent context初始化
③事件多播器environmentPrepared发布环境准备事件
循环父类
7、initMessageSource
List<ApplicationContextInitializer<?>>
加载 Package 资源
BootstrapApplicationListener事件监听
5、invokeBeanFactoryPostProcessors
ApplicationEnvironmentPreparedEvent 环境准备
系统类加载器启动类加载器
添加
invokeBeanFactoryPostProcessors
started
根据事件类型从事件监听列表中获取相关的监听器
Binder,将环境变量中的值,注入到对象的属性字段中
设置属性值
默认:非WEB:AnnotationConfigApplicationContextWEB:AnnotationConfigServletWebServerApplicationContext如:SpringBootServletInitializer 启动 RootServlet ApplicationContext
②SpringFactoriesLoader加载ApplicationListener
1)设置beanFactory类加载器2)设置bean表达式解释器(EL表达式熟悉解析)3)设置PropertyEditor属性编辑器4)添加后置处理器ApplicationContextAwareProcessor5)跳过特定属性的自动注入6)注册几个自动装配规则7)添加后置处理器ApplicationListenerDetector8)添加后置处理器LoadTimeWeaverAwareProcessor9)注册系统信息https://gitee.com/zxlv/notes/blob/master/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%B8%93%E9%A2%98/Spring%E6%BA%90%E7%A0%81.md
ApplicationReadyEvent 运行
spring.factories中配置的监听器
注意:所谓的注册,其实就是从BeanFactory中获取,如果没有则创建并注册,然后为当前ApplicationContext 和 BeanFactory的相关变量赋值
②SpringFactoriesLoader 加载META-INF/spring.factories
颜色
含义
其他流程调用
1)创建Bean
MapPerpertySource:bootstrap
contextPrepared
②SpringFactoriesLoader加载ApplicationContextInitializer
注册特殊的Bean到IOC容器springApplicationArgumentsspringBootBanner
1)给事件多播器注册事件2)发布早期的ApplicationListener
执行BeanFactoryPostProcessor的方法
缓存是否存在?
SpringApplication.run()
加载 String 资源
publishEvent()
6、registerBeanPostProcessors
将环境中PropertySourceList,包装成SpringConfigurationPropertySources(Mutable)放到PropertySourceList首位。因此,第一个PropertySource将包含所有的环境变量值。所有的查询只会走这个类,此类实现了通过树形名称解析值
BootstrapApplicationContext启动时,BannerMode为OFF,不会打印
1)执行所有BeanFactoryPostProcessor
包括:@Lazy、@Primary、@DependsOn、@Role、@Description等注解也会解析成Metadata
1)注册MessageSource
⑦Load 扫描所有Source 生成并注册BeanDefinition
Class生成BeanDefinition
3、prepareBeanFactory
⑦load 加载所有的source
打印Banner
加载 Class 资源
处理@Bean修饰的方法
返回beanFactory
11、finishBeanFactoryInitialization
获取spring.factories配置
boostrpapplication
唯一实现EventPublishingRunListener
③事件多播器starting:发布启动事件
处理内部类@Component
MapPerpertySource:systemEnvironment
合并BootstrapAppliction环境propertySoures到main SpringAppliction环境
starting
调用监听器onApplicationEvent
延时类型延后处理
ApplicationFailedEvent 失败
ConfigurableEnvironment环境的重要属性:1)propertySources属性资源:包含所有系统环境变量,命令行参数,虚拟机参数,本地(properties、yml)和远程配置文件(consul、nacos)
1、prepareRefresh
1)注册所有BeanPostProcessors:PriorityOrdered > Order > 无Order > MergedBeanDefinitionPostProcessor > ApplicationListenerDetector
1)Main ApplicationContext,首次进入,只有一个配置类为:Application main方法传入的主类2)判断依据:递归查询存在@Configuration递归查询存在@Component、@ComponentScan、Import、ImportResource类中方法存在@Bean
⑥忽略Bean系统属性设置
过滤
递归处理@Import
⑤BootstrapApplication
contextLoaded
failed
1)默认:空2)web类型容器:AnnotationConfigServletWebServerApplicationContext启动Tomcat服务
获取事件监听器
1)注册LifecycleProcessor2)执行生命周期类:doStart方法3)事件多播器:发送ContextRefreshedEvent事件
将环境绑定到SpringApplication
1)设置sources:BootstrapImportSelectorConfiguration.class处理@BootstrapConfiguration注解2)web:NONE非web容器
③事件多播器contextLoaded:准备
0 条评论
下一页