亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring中的refresh方法分析

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

1 前言

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

2 源碼入口哪里找

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

獲取方法的入口常見(jiàn)的如下所示:

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

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

3 refresh 核心方法

關(guān)于源碼的閱讀,因其復(fù)雜的文件結(jié)構(gòu),在梳理其結(jié)構(gòu)時(shí),需要抓大放小,不宜深入細(xì)節(jié),否則就容易迷路,不記得來(lái)時(shí)的路了。下圖便是核心方法 AbstractApplicationContext.refresh

對(duì)于 refresh 方法主要分為以下核心的 12 個(gè)方法:

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

4 總結(jié)

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

以上就是Spring中的refresh方法分析的詳細(xì)內(nèi)容,更多關(guān)于spring refresh 方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringCloud邁向云原生的步驟

    SpringCloud邁向云原生的步驟

    這篇文章主要介紹了SpringCloud怎么邁向云原生,通過(guò)本文我們來(lái)梳理一下Spring?Cloud的前世今生,以及未來(lái)云原生發(fā)展的趨勢(shì),可以給這些RPC框架的演進(jìn)帶來(lái)一些啟發(fā),感興趣的朋友跟隨小編一起看看吧
    2022-10-10
  • java轉(zhuǎn)換字符串編碼格式的方法

    java轉(zhuǎn)換字符串編碼格式的方法

    這篇文章主要介紹了java轉(zhuǎn)換字符串編碼格式的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • springboot實(shí)現(xiàn)分頁(yè)功能的完整代碼

    springboot實(shí)現(xiàn)分頁(yè)功能的完整代碼

    Spring Boot是一個(gè)快速開(kāi)發(fā)框架,它提供了很多便捷的功能,其中包括分頁(yè)查詢(xún),下面這篇文章主要給大家介紹了關(guān)于springboot實(shí)現(xiàn)分頁(yè)功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • java8 stream 操作map根據(jù)key或者value排序的實(shí)現(xiàn)

    java8 stream 操作map根據(jù)key或者value排序的實(shí)現(xiàn)

    這篇文章主要介紹了java8 stream 操作map根據(jù)key或者value排序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java隨機(jī)生成字符串的四種方式例子

    Java隨機(jī)生成字符串的四種方式例子

    這篇文章主要給大家介紹了關(guān)于Java隨機(jī)生成字符串的四種方式,隨機(jī)數(shù)在實(shí)際中使用很廣泛,比如要隨即生成一個(gè)固定長(zhǎng)度的字符串、數(shù)字,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-10-10
  • Java 中責(zé)任鏈模式實(shí)現(xiàn)的三種方式

    Java 中責(zé)任鏈模式實(shí)現(xiàn)的三種方式

    本文重點(diǎn)給大家介紹java中如何編寫(xiě)責(zé)任鏈模式。主要從下面3個(gè)框架中的代碼中介紹。非常不錯(cuò),需要的朋友參考下吧
    2017-09-09
  • SpringBoot整合Druid數(shù)據(jù)源過(guò)程詳解

    SpringBoot整合Druid數(shù)據(jù)源過(guò)程詳解

    這篇文章主要介紹了SpringBoot整合Druid數(shù)據(jù)源過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • spring cloud中啟動(dòng)Eureka Server的方法

    spring cloud中啟動(dòng)Eureka Server的方法

    本篇文章主要介紹了spring cloud中啟動(dòng)Eureka Server的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • springboot2.6.3讀取不到nacos上的配置文件問(wèn)題

    springboot2.6.3讀取不到nacos上的配置文件問(wèn)題

    這篇文章主要介紹了springboot2.6.3讀取不到nacos上的配置文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java設(shè)計(jì)模式之觀(guān)察者模式

    Java設(shè)計(jì)模式之觀(guān)察者模式

    這篇文章主要介紹了Java設(shè)計(jì)模式之觀(guān)察者模式,觀(guān)察者模式,是一種行為性模型,又叫發(fā)布-訂閱模式,他定義對(duì)象之間一種一對(duì)多的依賴(lài)關(guān)系,使得當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴(lài)于它的對(duì)象都會(huì)得到通知并自動(dòng)更新,需要的朋友可以參考下
    2023-11-11

最新評(píng)論