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個步驟,這個只是比較粗略的介紹各個步驟所負責的職責.後續在詳細分析.