一、入口类分析
入口类主要有SpringApplication类的run方法进入,配合SpringBootApplication注解进行配置

image.png
SpringBootApplication注解由ComponentScan,EnableAutoConfiguration,EnableAutoConfiguration组合注解构成。ComponentScan:可配置扫描包EnableAutoConfiguration:注解中Import了AutoConfigurationImportSelector类在此类中会查找META-INF/spring.factories中配置的EnableAutoConfiguration类
image.png
下面代码为
AutoConfigurationImportSelector 中返回注入组件的代码主要由SpringFactoriesLoader加载各个jar包下META-INF/spring.factories配置的EnableAutoConfiguration类返回
image.png

image.png
spring-boot-autoconfigure-2.1.1.RELEASE.jar中META-INF/spring.factories的自动配置类信息
image.png
二、SpringApplication之run方法
SpringApplication的静态run方法首先会根据入口类参数实例初始化SpringApplication对象,然后执行对象run方法启动。
1、实例化方法分析
此处会初始化是否是web应用,然后初始化ApplicationContextInitializer,ApplicationListener。初始化过程类似自动配置注解通过SpringFactoriesLoader加载各个jar包下META-INF/spring.factories配置的ApplicationContextInitializer和ApplicationListener

image.png

image.png
2、实例run方法分析
(1)listeners的生命周期通知处理
红圈处为listeners的生命周期通知处理

image.png
具体通知分发代码

image.png
(2)spring具体执行
-
spring容器初始化启动的主要方法为prepareContext、refreshContext方法
prepareContext方法中主要执行listeners事件通知,ApplicationContextInitializer执行,以及加载资源信息BeanDefinitionLoader
image.png
refreshContext方法实际执行有AbstractApplicationContext执行refresh,简单的分析refresh执行环节

spring-refresh.jpg
this.postProcessBeanFactory(beanFactory);
执行当前容器的BeanFactoryPostProcessor的方法this.invokeBeanFactoryPostProcessors(beanFactory);
执行容器中所有的beanFactoryPostProcessorsthis.registerBeanPostProcessors(beanFactory);
注册容器中所有属于BeanPostProcessor组件到容器,在实例初始化前后执行
this.initMessageSource();this.initApplicationEventMulticaster();
初始化Listeners分发器this.onRefresh();
web应用会在ServletWebServerApplicationContext创建web容器this.registerListeners();
将applicationListeners注册进容器this.finishBeanFactoryInitialization(beanFactory);this.finishRefresh();
清除资源缓存,发送完成事件,注册容器到LiveBeansView
BeanFactoryPostProcessor 一般由ApplicationContextInitializer的初始化方法或者ApplicationListener增加

image.png

image.png
web环境下context实际为
ServletWebServerApplicationContext执行其中的refresh会转到AbstractApplicationContext执行然后接着会在onRefresh中创建webServer内置web容器
image.png

image.png

