Spring的应用Refesh的基本流程

主要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)

  1. 设置beanFactory的classLoader,
  2. 设置BeanExpressionResolver,默认是StandardBeanExpressionResolver,是EL的表达式的解析.
  3. 增长PropertyEditorRegistrar,设置属性编辑注册器.
  4. 增长BeanPostProcessor实例ApplicationContextAwareProcessor,

这个是执行的postProcessBeforeInitialization方法时候,执行Aware回调, 将applicationContext设置到实现了ApplicationAware的bean中. 5) 设置能够忽略的依赖接口 EnvironmentAware,EmbeddedValueResolverAware,ResourceLoaderAware, ApplicationEventPublisherAware,MessageSourceAware,ApplicationContextAware, 这六个接口是依赖是能够跳过这个set的注入依赖的.由于这6个是Aware的回调的依赖. 6) 注册能够处理的依赖的. BeanFactory.class ---> DefaultListableBeanFactory ResourceLoader.class --> ApplicationContext ApplicationEventPublisher.class -> ApplicationContext ApplicationContext --> ApplicationContext 7) 增长一个BeanPostProcessor: ApplicationListenerDetector, 主要是是在postProcessAfterInitialization中检查Bean初始化完后哪些是ApplicationListener的bean,并加入ApplicationContext中. 8) 注册3个单例,第一个environment是,默认是建立的是StandardEnvironment,第二个是系统配置 systemProperties, markdown

4 postProcessBeanFactory阶段(后置处理BeanFactory)

BeanFactroy的后置处理器,主要是为子类扩展使用,好比 AnnotationConfigServletWebApplicationContext就是使用 ClassPathBeanDefinitionScanner去扫描包下全部的注解的bean,并注册到 BeanDefinitionRegistry中app

5 invokeBeanFactoryPostProcessors阶段(调用BeanFactory的

BeanFactoryPostProcessor)post

  1. 按照 PriorityOrdered, Ordered 没有实现任何前面的两个接口,

分红3类,进行优先级排序处理BeanFacoty的调用postProcessBeanFactory,spa

6 registerBeanPostProcessors(注册BeanPostProcessor)

  1. 经过BeanFactory的getBeanNamesForType,依赖查找到全部的

BeanPostProcessor的名称. 2) 按照的实现了优先级的PriorityOrdered, Ordered 和没有实现前两个接口, 的分类排序,注册到BeanFactory. 3d

7 initMessageSource(初始化MessageSource)

注册默认的MessageSource的Bean是DelegatingMessageSource, 这个是国际化的使用的,日常使用不多.code

7 initApplicationEventMulticaster(初始化 ApplicationEventMulticaster事件发生器)

主要是初始化一个默认事件发生器: SimpleApplicationEventMulticasterorm

8 onRefresh(刷新的的扩展接口)

Spring的是空的操做, 留给子类扩展实现,去作特殊Bean的初始化.好比像 Web的 扩展,是建立WebServer.对象

9 registerListeners(注册监听器)

注册监听器到ApplicationEventMulticaster中.排序

10 finishBeanFactoryInitialization(结束BeanFactor的初始化)

  1. setBeanFactory的ConversionService,
  2. beanFactory增长StringValueResolver处理器
  3. 初始化 LoadTimeWeaverAware
  4. 设置BeanFactory的TempCloassLoader为null.
  5. BeanFactory的freezeConfiguration(冻结beanDefitionNames,不容许修改)
  6. 初始化全部的非延迟的单例bean(这里面涉及bean的生命周期,下一篇回单独解析)

11 finishRefresh*(结束shuaxin)

  1. 清除资源缓存
  2. 初始化lifecycleProcessor,默认是往BeanFactory注册

DefaultLifecycleProcessor实例 3) 调用LifecycleProcessor的onFresh的方法 4) 发布 ContextRefreshedEvent事件 5) LiveBeansView注册ApplicationContext,( LiveBeansView是MBean中的, 是JVM监控用的)

总结: Spring的ApplicationContext的启动基本流程就是这个11个步骤,这个只是比较粗略的介绍各个步骤所负责的职责.后续在详细分析.