最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于ApplicationContext的啟動(dòng)流程詳解

 更新時(shí)間:2025年03月10日 08:39:30   作者:冰糖心書房  
ApplicationContext是Spring框架中用于管理和配置Bean的核心接口,它的啟動(dòng)流程包括準(zhǔn)備刷新、獲取BeanFactory、準(zhǔn)備BeanFactory、后置處理BeanFactory、調(diào)用BeanFactoryPostProcessor、注冊(cè)BeanPostProcessor

ApplicationContext的啟動(dòng)流程

  • ApplicationContext 是 Spring IoC 容器的核心接口,它提供了配置、訪問和管理 Bean 的功能。
  • ApplicationContext 的啟動(dòng)流程可以細(xì)分為以下幾個(gè)關(guān)鍵步驟,這些步驟主要在 AbstractApplicationContext 類的 refresh() 方法中實(shí)現(xiàn):

1. prepareRefresh()

- 準(zhǔn)備刷新:

  • 設(shè)置啟動(dòng)時(shí)間戳。
  • 設(shè)置容器的激活狀態(tài)。
  • 初始化屬性源 (property sources),用于解析占位符(例如,${...})。
  • 驗(yàn)證必需的屬性(如果有)。
  • 創(chuàng)建并保存早期事件監(jiān)聽器集合 (early application listeners).

2. obtainFreshBeanFactory()

- 獲取 BeanFactory:

  • 如果存在舊的 BeanFactory,則銷毀其中的 Bean 并關(guān)閉舊的 BeanFactory。
  • 創(chuàng)建新的 BeanFactory (通常是 DefaultListableBeanFactory)。
  • 設(shè)置 BeanFactory 的序列化 ID (如果需要)。
  • 定制 BeanFactory (例如,設(shè)置類加載器、添加后置處理器等)。
  • 加載 Bean 定義 (調(diào)用 loadBeanDefinitions 方法):
    • XmlBeanDefinitionReader: 從 XML 配置文件加載。
    • AnnotatedBeanDefinitionReader: 從注解配置類加載。
    • ClassPathBeanDefinitionScanner: 掃描類路徑并加載帶有注解的 Bean。

3. prepareBeanFactory(beanFactory)

- 準(zhǔn)備 BeanFactory:

  • 設(shè)置 BeanFactory 的類加載器。
  • 設(shè)置表達(dá)式解析器 (用于解析 SpEL 表達(dá)式)。
  • 設(shè)置屬性編輯器注冊(cè)器。
  • 添加內(nèi)置的 BeanPostProcessor (例如,ApplicationContextAwareProcessorApplicationListenerDetector 等)。
  • 配置依賴關(guān)系解析(忽略某些接口的自動(dòng)裝配,注冊(cè)特殊的依賴項(xiàng))。
  • 注冊(cè)一些內(nèi)置的 Bean (例如,environment、systemProperties、systemEnvironment)。

4. postProcessBeanFactory(beanFactory)

- BeanFactory 后置處理:

  • 允許子類對(duì) BeanFactory 進(jìn)行進(jìn)一步的定制。
  • 這是一個(gè)模板方法,由具體的 ApplicationContext 實(shí)現(xiàn)類(如 AnnotationConfigApplicationContext)提供具體實(shí)現(xiàn)。

5. invokeBeanFactoryPostProcessors(beanFactory)

- 調(diào)用 BeanFactoryPostProcessor:

  • 調(diào)用所有已注冊(cè)的 BeanFactoryPostProcessor (包括 BeanDefinitionRegistryPostProcessor)。
    • 先調(diào)用實(shí)現(xiàn)了 PriorityOrdered 接口的。
    • 再調(diào)用實(shí)現(xiàn)了 Ordered 接口的。
    • 最后調(diào)用普通的 BeanFactoryPostProcessor。
  • BeanFactoryPostProcessor 可以在 Bean 實(shí)例化之前修改 BeanFactory 的配置元數(shù)據(jù)。
  • BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor的子接口,它可以在Bean 定義加載完成后,但在 Bean 實(shí)例化之前執(zhí)行,允許添加、刪除或修改 Bean 定義。

6. registerBeanPostProcessors(beanFactory)

- 注冊(cè) BeanPostProcessor:

  • 注冊(cè)所有實(shí)現(xiàn)了 BeanPostProcessor 接口的 Bean。
    • 先注冊(cè)實(shí)現(xiàn)了 PriorityOrdered 接口的。
    • 再注冊(cè)實(shí)現(xiàn)了 Ordered 接口的。
    • 最后注冊(cè)普通的 BeanPostProcessor
    • 重新注冊(cè)內(nèi)部的 BeanPostProcessor (MergedBeanDefinitionPostProcessor).
  • BeanPostProcessor 可以在 Bean 初始化前后進(jìn)行處理。

7. initMessageSource()

- 初始化 MessageSource:

  • 初始化國(guó)際化消息源 (MessageSource)。
  • 如果在 BeanFactory 中找到名為 messageSource 的 Bean,則使用該 Bean;否則,創(chuàng)建一個(gè)默認(rèn)的 DelegatingMessageSource

8. initApplicationEventMulticaster() - 初始化事件廣播器:

  • 初始化應(yīng)用事件廣播器 (ApplicationEventMulticaster)。
  • 如果在 BeanFactory 中找到名為 applicationEventMulticaster 的 Bean,則使用該 Bean;否則,創(chuàng)建一個(gè)默認(rèn)的 SimpleApplicationEventMulticaster。

9. onRefresh()

- 刷新 (可選):

  • 這是一個(gè)模板方法,由具體的 ApplicationContext 實(shí)現(xiàn)類提供具體實(shí)現(xiàn)。
  • 例如,AbstractRefreshableWebApplicationContext 會(huì)在這里創(chuàng)建或刷新 Servlet 上下文。

10. registerListeners()

- 注冊(cè)監(jiān)聽器:

  • 將之前收集的早期應(yīng)用事件監(jiān)聽器 (early application listeners) 和在容器中定義的監(jiān)聽器注冊(cè)到事件廣播器 (ApplicationEventMulticaster)。
  • 發(fā)布早期的應(yīng)用事件 (early application events).

11. finishBeanFactoryInitialization(beanFactory)

- 完成 BeanFactory 初始化:

  • 初始化類型轉(zhuǎn)換器 (ConversionService),如果存在名為 conversionService 的 Bean。
  • 凍結(jié)配置(不允許再修改 Bean 定義)。
  • 實(shí)例化所有剩余的非懶加載的單例 Bean (調(diào)用 beanFactory.preInstantiateSingletons())。

12. finishRefresh()

- 完成刷新:

  • 清空資源緩存 (例如,ResourceBundleMessageSource 的緩存)。
  • 初始化生命周期處理器 (LifecycleProcessor),如果存在名為 lifecycleProcessor 的 Bean。
  • 調(diào)用 LifecycleProcessoronRefresh() 方法。
  • 發(fā)布 ContextRefreshedEvent 事件,通知所有監(jiān)聽器容器已刷新。
  • 注冊(cè) LiveBeansView MBean (如果啟用).

13. 異常處理和重置

  • 如果在 refresh() 過程中發(fā)生異常, 則銷毀已經(jīng)創(chuàng)建的單例 Bean.
  • 重置容器的激活狀態(tài).

總結(jié)流程圖:

+-----------------------+
|   start()             |
+-----------------------+
        |
        V
+-----------------------+
|   refresh()           |
+-----------------------+
        |
        V
+-----------------------+
|   prepareRefresh()    |  (準(zhǔn)備刷新)
+-----------------------+
        |
        V
+-----------------------+
| obtainFreshBeanFactory()| (獲取 BeanFactory, 加載 Bean 定義)
+-----------------------+
        |
        V
+-----------------------+
| prepareBeanFactory()  |  (準(zhǔn)備 BeanFactory)
+-----------------------+
        |
        V
+-----------------------+
|postProcessBeanFactory()| (BeanFactory 后置處理, 可選)
+-----------------------+
        |
        V
+-----------------------+
|invokeBeanFactoryPPs()| (調(diào)用 BeanFactoryPostProcessor)
+-----------------------+
        |
        V
+-----------------------+
|registerBeanPostPrcs()| (注冊(cè) BeanPostProcessor)
+-----------------------+
        |
        V
+-----------------------+
| initMessageSource()   |  (初始化 MessageSource)
+-----------------------+
        |
        V
+-----------------------+
|initApplicationEventM()| (初始化事件廣播器)
+-----------------------+
        |
        V
+-----------------------+
|   onRefresh()         |  (刷新, 可選)
+-----------------------+
        |
        V
+-----------------------+
| registerListeners()   |  (注冊(cè)監(jiān)聽器)
+-----------------------+
        |
        V
+-----------------------+
|finishBeanFactoryInit()| (完成 BeanFactory 初始化, 實(shí)例化單例 Bean)
+-----------------------+
        |
        V
+-----------------------+
|  finishRefresh()      |  (完成刷新, 發(fā)布 ContextRefreshedEvent)
+-----------------------+
        |
        V
+-----------------------+
|     容器就緒           |
+-----------------------+

關(guān)鍵點(diǎn):

  • refresh() 方法是 ApplicationContext 啟動(dòng)的核心。
  • BeanFactory 是實(shí)際創(chuàng)建和管理 Bean 的組件。
  • BeanDefinition 描述了如何創(chuàng)建和配置 Bean。
  • BeanFactoryPostProcessor 可以在 Bean 實(shí)例化之前修改 BeanFactory 的配置元數(shù)據(jù)。
  • BeanPostProcessor 可以在 Bean 初始化前后進(jìn)行處理。
  • ApplicationListener 可以監(jiān)聽容器發(fā)布的事件。
  • Spring Boot 在 Spring Framework 的基礎(chǔ)上,進(jìn)一步簡(jiǎn)化了 ApplicationContext 的創(chuàng)建和配置,但其核心啟動(dòng)流程仍然遵循上述步驟。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

夹江县| 夏津县| 海兴县| 西青区| 章丘市| 忻州市| 八宿县| 武陟县| 石河子市| 济源市| 基隆市| 梅州市| 留坝县| 湘西| 德庆县| 江达县| 丰城市| 古蔺县| 高清| 疏勒县| 湘潭市| 南江县| 西昌市| 疏附县| 颍上县| 介休市| 秀山| 兰州市| 信宜市| 邹平县| 车险| 沛县| 双城市| 浪卡子县| 津市市| 新蔡县| 庆安县| 自治县| 凉城县| 昆山市| 揭阳市|