## 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()