|
|
## 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,<font color=red>MessageSource是格式化字符串的?</font>
|
|
|
|
|
|
### initApplicationEventMulticaster()
|
|
|
|
|
|
初始化应用事件监听器,SimpleApplicationEventMulticaster通过线程池往各种监听器添加事件。
|
|
|
|
|
|
### onRefresh()
|
|
|
|
|
|
由子类实现,比如Spring Boot创建web server。
|
|
|
|
|
|
### registerListeners()
|
|
|
|
|
|
注册所有实现了ApplicationListener接口的监听器,并发布早起应用事件。
|
|
|
|
|
|
### finishBeanFactoryInitialization(beanFactory)
|
|
|
|
|
|
实例化所有非懒加载的单例。
|
|
|
ConversionService(转换系统的一个入口,<font color=red>可用于常见的日期格式转换?</font>)、添加EmbeddedValueResolver、BeanFactory方式获取LoadTimeWeaverAware、置空temporary ClassLoader、冻结配置、预实例化单例。
|
|
|
preInstantiateSingletons()
|
|
|
遍历beanNames,触发所有非懒加载bean实例化。
|
|
|
遍历beanNames,触发所有适用 bean 的初始化后回调。
|
|
|
getBean(beanName) -> doGetBean -> getSingleton(三级缓存) -> createBean -> doCreateBean -> 代理和反射创建bean(三级缓存) -> populateBean -> initializeBean
|
|
|
|
|
|
### finishRefresh()
|
|
|
|
|
|
清理资源缓存、初始化LifecycleProcessor、发布最终事件
|
|
|
|
|
|
### resetCommonCaches()
|
|
|
|
|
|
### contextRefresh.end()
|