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

Spring中的refresh方法分析

 更新時間:2022年08月17日 15:09:09   作者:??斜月????  
這篇文章主要介紹了Spring中的refresh方法分析,文章圍繞主題展開詳細的refresh方法相關資料介紹,需要的小伙伴可以參考一下

1 前言

在項目開發(fā)和面試過程中 spring 都是非常重要的,在前文中已經(jīng)講述了Spring BeanFactory 與 FactoryBean 的區(qū)別,在后續(xù)的文章中將繼續(xù)更新 Spring 源碼心得。了解原理性的一些內容之后就會在應用能夠得心應手,在項目開發(fā)和面試中,就能很好地 battle 和 show muscle。

2 源碼入口哪里找

Spring 的源碼閱讀,需要找到入口文件,一般情況下在 Spring 項目中,由 tomcat 容器啟動后加載項目中設置的 web.xml,在改文件中添加項目的配置文件,監(jiān)聽器等內容,其中 DispatcherServlet 尤為重要,其 onRefresh 方法就是其核心操作。不過隨著 springboot 的誕生,配置化的思想成型后,獲取源碼的入口就相對簡單了,核心需要關注 AbstractApplicationContext.refresh。

獲取方法的入口常見的如下所示:

# 通過配置文件來讀取
ClassPathXmlApplicationContext ct = new ClassPathXmlApplicationContext("bean.xml");
# 通過配置類來加載
AnnotationConfigApplicationContext ct = new AnnotationConfigApplicationContext(MainConfig.class);
# 兩者都是AbstractApplicationContext 的子類
AbstractApplicationContext

如下圖所示,通過配置文件來加載的 ClassPathXmlApplicationContext 是在構造方法中調用了其父類的 refresh 方法,這個方法就是核心,就是大家都知道的 AbstractApplicationContext.refresh() 。

3 refresh 核心方法

關于源碼的閱讀,因其復雜的文件結構,在梳理其結構時,需要抓大放小,不宜深入細節(jié),否則就容易迷路,不記得來時的路了。下圖便是核心方法 AbstractApplicationContext.refresh

對于 refresh 方法主要分為以下核心的 12 個方法:

  • prepareRefresh() 刷新前的預處理,調用 initPropertySources() 方法初始化一些屬性設置,調用 getEnvironment().validateRequiredProperties() 校驗屬性的合法性,設置 earlyApplicationEvents= new LinkedHashSet() 保存容器中較早期的事件。
  • obtainFreshBeanFactory() 獲取 BeanFactory,創(chuàng)建一個刷新的 Bean 工廠,refreshBeanFactory() 并設置容器 ID,然后將創(chuàng)建的 DefaultListableBeanFactory 的對象進行返回。
  • prepareBeanFactory(beanFactory) BeanFactory 的預準備工作,設置 BeanFactory 的類加載器和表達式解析器,并添加 BeanPostProcessor【ApplicationContextAwareProcessor】,設置自動裝配的接口,添加 BeanPostProcessor。
  • postProcessBeanFactory(beanFactory) BeanFactory 準備工作完成后進行的后置處理工作,子類通過重寫這個方法來做進一步的設置。
  • invokeBeanFactoryPostProcessors(beanFactory) 執(zhí)行 BeanFactoryPostProcessor 和 BeanFactory 方法的后置處理器。在 BeanFactory 標準初始化之后執(zhí)行 BeanFactoryPostProcessor 和 BeanDefinitionRegistryPostProcessor。先執(zhí)行 BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry 方法,按照 PriorityOrdered 、Ordered 和其它未設置優(yōu)先級來執(zhí)行,然后按照同樣的優(yōu)先級來執(zhí)行 BeanFactoryPostProcessor.postProcessBeanFactory 方法。
  • registerBeanPostProcessors(beanFactory) 注冊 BeanPostProcessor(Bean 的后置處理器),不同接口類型的 BeanPostProcessor 在 Bean 創(chuàng)建前后的執(zhí)行時機是不一樣的。
  • initMessageSource() 初始化 MessageSource 組件, 做國際化功能、消息綁定、消息解析等。
  • initApplicationEventMulticaster() 初始化事件派發(fā)器,如果容器中沒有事件派發(fā)器,那么就創(chuàng)建一個 SimpleApplicationEventMulticaster 并添加到容器中。
  • onRefresh() 留給子容器(子類),例如在 springboot 中,用來創(chuàng)建 tomcat、jetty 容器并啟動。
  • 10 registerListeners() 給容器中將所有項目里面的 ApplicationListener 注冊進來,并將監(jiān)聽器注冊到事件派發(fā)器中。
  • 11 finishBeanFactoryInitialization(beanFactory) 初始化所有剩下的單實例 bean,這個方法是核心方法,在后續(xù)的主要流程中會詳細講解。
  • 12 finishRefresh()完成 BeanFactory 的初始化創(chuàng)建工作,IOC 容器就創(chuàng)建完成。

4 總結

在本文中,講述了 Spring 容器啟動的核心方法 refresh, 介紹了主要的啟動流程方法

以上就是Spring中的refresh方法分析的詳細內容,更多關于spring refresh 方法的資料請關注腳本之家其它相關文章!

相關文章

  • SpringBoot集成Jasypt敏感信息加密的操作方法

    SpringBoot集成Jasypt敏感信息加密的操作方法

    這篇文章主要介紹了SpringBoot集成Jasypt加密敏感信息,包括敏感信息加密的作用,項目集成Jasypt方式詳解,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • 關于SpringSecurity的基本使用示例

    關于SpringSecurity的基本使用示例

    這篇文章主要介紹了關于SpringSecurity的基本使用示例,SpringSecurity 本質是一個過濾器鏈SpringSecurity 采用的是責任鏈的設計模式,它有一條很長的過濾器鏈,需要的朋友可以參考下
    2023-05-05
  • 一文了解為什么Java中只有值傳遞

    一文了解為什么Java中只有值傳遞

    Java?傳參是值傳遞還是引用傳遞?這個問題很基礎,但是許多人都有點懵。本文就來通過一些示例帶大家詳細了解一下,需要的可以參考一下
    2022-07-07
  • 詳解Spring Boot 異步執(zhí)行方法

    詳解Spring Boot 異步執(zhí)行方法

    這篇文章主要介紹了Spring Boot 異步執(zhí)行方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 詳解Spring Boot最核心的27個注解,你了解多少?

    詳解Spring Boot最核心的27個注解,你了解多少?

    這篇文章主要介紹了詳解Spring Boot最核心的27個注解,你了解多少?文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • springboot中json對象中對Long類型和String類型相互轉換

    springboot中json對象中對Long類型和String類型相互轉換

    與前端聯(lián)調接口時,后端一些字段設計為Long類型,這樣就有可能導致前端缺失精度,這時候我們就需要將Long類型返回給前端時做數(shù)據(jù)類型轉換,本文主要介紹了springboot中json對象中對Long類型和String類型相互轉換,感興趣的可以了解一下
    2023-11-11
  • Java批量操作文件系統(tǒng)的實現(xiàn)示例

    Java批量操作文件系統(tǒng)的實現(xiàn)示例

    文件上傳和下載是java web中常見的操作,本文主要介紹了Java批量操作文件系統(tǒng)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-03-03
  • java遍歷HashMap簡單的方法

    java遍歷HashMap簡單的方法

    這篇文章主要介紹了java遍歷HashMap簡單的方法,以實例形式簡單分析了采用java遍歷HashMap的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Spring Boot集成Ehcache緩存解決方式

    Spring Boot集成Ehcache緩存解決方式

    在本篇文章里小編給大家整理的是關于Spring Boot集成Ehcache緩存解決方式,需要的朋友們可以學習下。
    2019-12-12
  • Java 實現(xiàn)棧的三種方式

    Java 實現(xiàn)棧的三種方式

    這篇文章主要介紹了棧:LIFO(后進先出),自己實現(xiàn)一個棧,要求這個棧具有push()、pop()(返回棧頂元素并出棧)、peek() (返回棧頂元素不出棧)、isEmpty()這些基本的方法,需要的朋友可以參考下
    2020-12-12

最新評論

新沂市| 邮箱| 洞头县| 安龙县| 太保市| 周宁县| 安福县| 临西县| 铜川市| 两当县| 佛教| 云和县| 泰和县| 贵港市| 乐安县| 建宁县| 沙雅县| 北安市| 安新县| 左云县| 淅川县| 吴旗县| 德保县| 饶河县| 揭东县| 汉中市| 宿迁市| 桂平市| 淄博市| 合川市| 大理市| 闻喜县| 古交市| 嘉黎县| 香港| 洪江市| 荣昌县| 奉贤区| 阿拉善盟| 军事| 安岳县|