Springboot第三章 Springboot启动 总结文
- 示例
- 1. SpringApplication实例创建
- 2. springApplication.run方法
- context的创建与初始化
- environment的创建与工作
- 监听器的创建与工作
示例
因为Spring boot的知识点非常多,一个示例不能囊括所有组件应用场景,所有就不写示例了,针对某些组件的应用写个小Demo。
1. SpringApplication实例创建
根据Spring Initializer创建的项目启动时可以分为两步,创建SpringApplication实例,执行springApplication.run方法,
1.1 获取WebApplicationType
WebApplicationType#deduceFromClasspath
1.2 SpringApplication 实例的创建 -变量initializers初始化
SpringApplication 实例的创建 -变量initializers初始化
1.3 SpringApplication 实例的创建 -变量listeners-this.setListeners()
SpringApplication 实例的创建 -变量listeners-this.setListeners()
2. springApplication.run方法
这块内容按顺序分析不太好,因为几个重要组件交错执行,为了理解Springboot是如何工作的,对重要组件一一
context的创建与初始化
我们都知道Springboot的IOC特性,容器在Springboot是第一重要的组件,所以Springboot启动的主流程就是创建容器、对容器的初始化(包括对容器属性的初始化、导入相关Bean组件)
2.1 ConfigurableApplicationContext context = null
首先拿到一个ConfigurableApplicationContext接口,因为run方法返回的就是一个ConfigurableApplicationContext,但是接口是不能作用的,这表名我们在整个过程中的context一定是一个ConfigurableApplicationContext接口的实现类。
相关组件
2.4 SpringApplication.createApplicationContext ——根据应用类型实例化相应ConfigurableApplicationContext接口实现类
2.4 context = this.createApplicationContext(); Application.createApplicationContext
相关组件
AnnotatedBeanDefinitionReader
AnnotatedBeanDefinitionReader 属性分别在何时初始化
AnnotatedBeanDefinitionReader # registerBean() 系列方法
ClassPathBeanDefinitionScanner
ClassPathBeanDefinitionScanner
2.5 this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
2.5 this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
相关组件
Initializer系列组件
ApplicationContextInitializer接口
ApplicationContextInitializer接口
DelegatingApplicationContextInitializer
DelegatingApplicationContextInitializer
SharedMetadataReaderFactoryContextInitializer
SharedMetadataReaderFactoryContextInitializer
ContextIdApplicationContextInitializer
ContextIdApplicationContextInitializer
ConfigurationWarningsApplicationContextInitializer
ConfigurationWarningsApplicationContextInitializer
RSocketPortInfoApplicationContextInitializer
RSocketPortInfoApplicationContextInitializer
ServerPortInfoApplicationContextInitializer
ServerPortInfoApplicationContextInitializer
2.6 this.refreshContext(context)
AbstractApplicationContext#refresh
AbstractApplicationContext#refresh
PostProcessorRegistrationDelegate
PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
this.onRefresh();
createWebServer
this.finishBeanFactoryInitialization(beanFactory);
this.finishBeanFactoryInitialization(beanFactory);
environment的创建与工作
Environment组件
准备Environment
ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
EnvironmentPostProcessor实现类
监听器的创建与工作
Springboot 事件监听机制实现
1.3 listener的创建
SpringApplicationEvent的处理
2.2 获取运行时监听器 SpringApplicationRunListeners并发布ApplicationStartingEvent事件
SpringApplicationRunListeners listeners = this.getRunListeners(args);
发布ApplicationEnvironmentPreparedEvent事件
发布ApplicationEnvironmentPreparedEvent事件
发布ApplicationContextInitializedEvent事件
ApplicationContextInitializedEvent
ApplicationContextEvent的处理
发布ContextRefreshedEvent事件
相关组件
RunListener组件
SpringApplicationRunListeners 组件
EventPublishingRunListener
EventMulticaster 广播组件
AbstractApplicationEventMulticaster
AbstractApplicationEventMulticaster
SimpleApplicationEventMulticaster
SimpleApplicationEventMulticaster
ApplicationListener
处理ApplicationStartingEvent事件的监听器
LoggingApplicationListener
BackgroundPreinitializer
DelegatingApplicationListener
LiquibaseServiceLocatorApplicationListener
LiquibaseServiceLocatorApplicationListener