溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Spring中的refresh方法怎么用

發(fā)布時(shí)間:2022-05-05 10:36:59 來(lái)源:億速云 閱讀:203 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“Spring中的refresh方法怎么用”,在日常操作中,相信很多人在Spring中的refresh方法怎么用問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Spring中的refresh方法怎么用”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

1 前言

了解原理性的一些內(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() 。

Spring中的refresh方法怎么用

3 refresh 核心方法

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

Spring中的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)建完成。

到此,關(guān)于“Spring中的refresh方法怎么用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI