new SpringApplication();
1):获取Web应用程序类型.
2):获取所有的 ApplicationContextInitializer (包括 Spring.factories).
3):获取所有的 ApplicationListener (包括 Spring.factories).
4):遍历栈信息,找到主应用程序类 mainApplicationClass.
SpringApplication.run(args);
1):获取所有的 SpringApplicationRunListener 并启动监听(包括 Spring.factories).
2):准备环境
2.1):创建环境:StandardServletEnvironment
2.2):发布广播 environmentPrepared 事件
2.2.1): ConfigFileApplicationListener 监听 environmentPrepared 事件;
获取 Spring.factories 中所有的 EnvironmentPostProcessor;
排序后遍历执行 EnvironmentPostProcessor 的 postProcessEnvironment 方法;
ConfigFileApplicationListener中的 postProcessEnvironment 会加载当前程序的yml/properties资源文件
2.3):将环境绑定到SpringApplication
3):配置忽略Bean信息
4):创建程序上下文
4.1): 通过构造方法实例化上下文 AnnotationConfigServletWebServerApplicationContext 时,
会调用父类构造方法创建BeanFactory!!!
同时创建AnnotatedBeanDefinitionReader(注解Bean定义读取器) 和 ClassPathBeanDefinitionScanner(Bean定义扫描器);
AnnotatedBeanDefinitionReader 会注册五个后置处理器:
①:ConfigurationClassPostProcessor
②:AutowiredAnnotationBeanPostProcessor
③:CommonAnnotationBeanPostProcessor
④:EventListenerMethodProcessor
⑤:DefaultEventListenerFactory
ClassPathBeanDefinitionScanner 中添加@Component 注解过滤器,设置java运行Environment 和 ResourceLoader
5):获取所有的SpringBoot异常报告器(包括 Spring.factories).
6):准备上下文
6.1):将 StandardServletEnvironment 设置给上下文
6.2):获取 Spring.factories 中所有的 ApplicationContextInitializer,遍历执行initialize 方法;
6.3):发布广播 contextPrepared 上下文初始化完成事件
6.4):如果SpringApplication设置了 lazyInitialization 则添加延迟初始化BeanFactoryPostProcessor
6.5):加载主应用程序类 mainApplicationClass.
6.6):发布广播 contextLoaded 上下文加载完成事件,
获取所有的 ApplicationListener 遍历判断是否需要注入ApplicationContextAware;
将所有的 ApplicationListener 添加到上下文;
添加一个BeanFactoryPostProcessor: PropertySourceOrderingPostProcessor
7):刷新上下文
7.1:准备刷新上下文
7.2:刷新内部BeanFactory,CAS设置refreshed为true 并设置 SerializationId
7.3:准备BeanFactory
设置BeanFactory的类加载器,bean表达式解释器,忽略给定接口的自动装配功能
注册ApplicationContextAwareProcessor(注入 applicationContext上下文,资源,系统参数等)
ApplicationListenerDetector(检测容器中的ApplicationLisenter,将其注册到上下文)
7.4:遍历执行所有的 BeanDefinitionRegistryPostProcessors 的 postProcessBeanDefinitionRegistry,按 PriorityOrdered -> Ordered -> NonOrdered 顺序执行, 其中最最重要的当属内置的 ConfigurationClassPostProcessor
ConfigurationClassPostProcessor 中解析所有 @Configuration配置类(@PropertySource、@ComponentScan(扫描@Component)、@Import、@Bean注解) 并加载到 BeanDefinitionMap中
...执行其他BeanDefinitionRegistryPostProcessor
遍历执行所有的 BeanFactoryPostProcessor 的 postProcessBeanFactory,按 PriorityOrdered -> Ordered -> NonOrdered 顺序执行
ConfigurationClassPostProcessor 中将上面解析出来的 BeanDefinition 中加了@Configuration注解的配置类进行Cglib代理, 并给代理类添加 BeanFactory 属性
...BeanFactoryPostProcessor
7.5:注册BeanPostProcessor后置处理器
在BeanFactory 容器中取出所有的 BeanPostProcessor,按 PriorityOrdered -> Ordered -> NonOrdered 顺序注册
ConfigurationClassPostProcessor中已经将所有解析到的类加载到 BeanFactory 中了
再次注册 ApplicationListenerDetector (检测容器中的 ApplicationLisenter 并注册)
7.6:初始化消息资源解析器
7.7:初始化程序事件委托器
7.8:注册事件监听器:将所有 ApplicationListener 加入事件委托器
7.9:实例化所有(非延迟初始化)单例
遍历所有 beanDefinitionName 创建实例。
检查缓存 singletonObjects、earlySingletonObjects 是否存在该实例,存在则获取返回,不存在则向下执行
检查 scope, 如果是Prototype也存在循环依赖,则直接抛异常。
检查是否能在 父级容器 获取Bean,如果找不到则委托当前容器的父级容器去查找,如果还是找不到则沿着容器的继承体系向父级容器查找(双亲委派机制),找到则直接返回,不存在则开始创建
SmartInstantiationAwareBeanPostProcessor-predictBeanType:确定给定bean的类型。
SmartInstantiationAwareBeanPostProcessor-getEarlyBeanReference:提前暴露的bean的引用,用来支持单例对象的循环引用。
InstantiationAwareBeanPostProcessor-postProcessBeforeInstantiation:bean实例化之前回调,如果有返回实例则直接跳转到postProcessAfterInitialization方法。
SmartInstantiationAwareBeanPostProcessor-determineCandidateConstructors:确定给定bean的候选构造函数。
createBeanInstance:创建 Bean 实例
加入 singletonFactories、registeredSingletons 缓存
MergedBeanDefinitionPostProcessor-postProcessMergedBeanDefinition:对指定bean的给定合并bean定义进行后处理。
InstantiationAwareBeanPostProcessor-postProcessAfterInstantiation:bean实例化之后回调。
InstantiationAwareBeanPostProcessor-postProcessProperties:将属性值应用于bean之前回调。
BeanPostProcessor-postProcessBeforeInitialization:bean初始化之前回调。
InitializingBean-afterPropertiesSet:自定义初始化方法。
xml中配置的init-method:xml指定的自定义初始化方法。
BeanPostProcessor-postProcessAfterInitialization:bean初始化之后回调。
加入 singletonObjects、registeredSingletons 缓存
检查循环依赖
检查创建的Bean实例对象类型
7.10:清空上下文资源缓存
初始化 上下文生命周期processor
发布广播 ContextRefreshedEvent 容器刷新完成事件
8):发布广播 ApplicationStartedEvent 事件( SpringApplicationRunListeners 监听事件并处理)
9):遍历处理所有 ApplicationRunner、CommandLineRunner
10):发布广播 ApplicationReadyEvent 事件( SpringApplicationRunListeners 监听事件并处理)