## Spring启动流程
### prepareRefresh()
记录时间、active标记、获取environment(系统环境变量和System.setProperty()设置的)、初始化监听器和事件集合。
### obtainFreshBeanFactory()
关闭以前的BeanFactory,创建一个新的BeanFactory供上下文生命周期的各阶段使用。
父beanDefinition、bean可覆盖、循环引用,
loadBeanDefinitions()通过inputStream读取并解析xml文档,拿到beanDefinition。
### prepareBeanFactory()
准备BeanFactory,设置ClassLoader、SPEL解析器、propertyEditor、BeanPostProcessor(ApplicationContextAwareProcessor)、ignoreDependencyInterface(各种Aware接口)、registerResolvableDependency、BeanPostProcessor(ApplicationListenerDetector)、environment单例。
### postProcessBeanFactory(beanFactory)
继承ClassPathXmlApplicationContext的子类可以修改beanFactory,用于实现一些自定义的功能。
### invokeBeanFactoryPostProcessors(beanFactory)
BeanDefinitionRegistryPostProcessors和BeanFactoryPostProcessors按照实现PriorityOrdered、Ordered接口、没有实现这两个接口的PostProcessors处理执行顺序,@Order注解在这里是不考虑的。
// Register bean processors that intercept bean creation.
### registerBeanPostProcessors(beanFactory)
BeanPostProcessor按照实现PriorityOrdered、Ordered接口、没有实现这两个接口的PostProcessors处理执行顺序,@Order注解在这里是不考虑的。
BeanPostProcessorChecker用来记录日志。
### initMessageSource()
初始化MessageSource,MessageSource是格式化字符串的?
### initApplicationEventMulticaster()
初始化应用事件监听器,SimpleApplicationEventMulticaster通过线程池往各种监听器添加事件。
### onRefresh()
由子类实现,比如Spring Boot创建web server。
### registerListeners()
注册所有实现了ApplicationListener接口的监听器,并发布早起应用事件。
### finishBeanFactoryInitialization(beanFactory)
实例化所有非懒加载的单例。
ConversionService(转换系统的一个入口,可用于常见的日期格式转换?)、添加EmbeddedValueResolver、BeanFactory方式获取LoadTimeWeaverAware、置空temporary ClassLoader、冻结配置、预实例化单例。
preInstantiateSingletons()
遍历beanNames,触发所有非懒加载bean实例化。
遍历beanNames,触发所有适用 bean 的初始化后回调。
getBean(beanName) -> doGetBean -> getSingleton(三级缓存) -> createBean -> doCreateBean -> 代理和反射创建bean(三级缓存) -> populateBean -> initializeBean
### finishRefresh()
清理资源缓存、初始化LifecycleProcessor、发布最终事件
### resetCommonCaches()
### contextRefresh.end()