主要Spring的版本是5.2.2版本分析.
Spring的ApplicationContext的刷新流程,总共是以下图中的十个步骤, 接下来会对每一个步骤进行的详细介绍.
1.prepareRefresh(准备刷新)
这个阶段主要
1) 设置startupDate,closed,active标识位.
2) 并初始化perpertySource和校验的properties的哪些是需要属性的配置.
3) 保存刷新之前的早期的earlyApplicationListeners监听器.
2.obtainFreshBeanFactory(获取刷新的BeanFactory)
1)创建Spring默认的BeanFactory实例是DefaultListableBeanFactory.
2)设置序列化serializationId,并缓存DefaultListableBeanFactory到Map对象.
3)自定义设置的BeanFactory中 allowBeanDefinitionOverriding和
allowCircularReferences,自定义缓存BeanDefinition是否允许重复
覆盖 和 是否允许循环饮引用.
4) 加载BeanDefinition到BeanFactory.,通过Xml或者Annotation的
方式,比如使用注解的方式获取beanDefinition,则是通过
AnnotatedBeanDefinitionReader去加载注解的BeanDefinition.
3 prepareBeanFactory阶段(准备BeanFactory)
- 设置beanFactory的classLoader,
- 设置BeanExpressionResolver,默认是StandardBeanExpressionResolver,是EL的表达式的解析.
- 增加PropertyEditorRegistrar,设置属性编辑注册器.
- 增加BeanPostProcessor实例ApplicationContextAwareProcessor, 这个是执行的postProcessBeforeInitialization方法时候,执行Aware回调, 将applicationContext设置到实现了ApplicationAware的bean中.
- 设置可以忽略的依赖接口 EnvironmentAware,EmbeddedValueResolverAware,ResourceLoaderAware, ApplicationEventPublisherAware,MessageSourceAware,ApplicationContextAware, 这六个接口是依赖是可以跳过这个set的注入依赖的.因为这6个是Aware的回调的依赖.
- 注册可以处理的依赖的.
BeanFactory.class ---> DefaultListableBeanFactory
ResourceLoader.class --> ApplicationContext
ApplicationEventPublisher.class -> ApplicationContext
ApplicationContext --> ApplicationContext
- 增加一个BeanPostProcessor: ApplicationListenerDetector, 主要是是在postProcessAfterInitialization中检查Bean初始化完后哪些是ApplicationListener的bean,并加入ApplicationContext中.
- 注册3个单例,第一个environment是,默认是创建的是StandardEnvironment,第二个是系统配置 systemProperties,
4 postProcessBeanFactory阶段(后置处理BeanFactory)
BeanFactroy的后置处理器,主要是为子类扩展使用,比如 AnnotationConfigServletWebApplicationContext就是使用 ClassPathBeanDefinitionScanner去扫描包下所有的注解的bean,并注册到 BeanDefinitionRegistry中
5 invokeBeanFactoryPostProcessors阶段(调用BeanFactory的
BeanFactoryPostProcessor)
- 按照 PriorityOrdered, Ordered 没有实现任何前面的两个接口, 分成3类,进行优先级排序处理BeanFacoty的调用postProcessBeanFactory,
6 registerBeanPostProcessors(注册BeanPostProcessor)
- 通过BeanFactory的getBeanNamesForType,依赖查找到所有的 BeanPostProcessor的名称.
- 按照的实现了优先级的PriorityOrdered, Ordered 和没有实现前两个接口,
的分类排序,注册到BeanFactory.
7 initMessageSource(初始化MessageSource)
注册默认的MessageSource的Bean是DelegatingMessageSource, 这个是国际化的使用的,平常使用很少.
7 initApplicationEventMulticaster(初始化 ApplicationEventMulticaster事件发生器)
主要是初始化一个默认事件发生器: SimpleApplicationEventMulticaster
8 onRefresh(刷新的的扩展接口)
Spring的是空的操作, 留给子类扩展实现,去做特殊Bean的初始化.比如像 Web的 扩展,是创建WebServer.
9 registerListeners(注册监听器)
注册监听器到ApplicationEventMulticaster中.
10 finishBeanFactoryInitialization(结束BeanFactor的初始化)
- setBeanFactory的ConversionService,
- beanFactory增加StringValueResolver处理器
- 初始化 LoadTimeWeaverAware
- 设置BeanFactory的TempCloassLoader为null.
- BeanFactory的freezeConfiguration(冻结beanDefitionNames,不允许修改)
- 初始化所有的非延迟的单例bean(这里面涉及bean的生命周期,下一篇回单独解析)
11 finishRefresh*(结束shuaxin)
- 清除资源缓存
- 初始化lifecycleProcessor,默认是往BeanFactory注册 DefaultLifecycleProcessor实例
- 调用LifecycleProcessor的onFresh的方法
- 发布 ContextRefreshedEvent事件
- LiveBeansView注册ApplicationContext,( LiveBeansView是MBean中的, 是JVM监控用的)
总结: Spring的ApplicationContext的启动基本流程就是这个11个步骤,这个只是比较粗略的介绍各个步骤所负责的职责.后续在详细分析.