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

淺談Spring refresh的工作流程

 更新時間:2023年04月26日 08:52:40   作者:Blue92120  
這篇文章主要介紹了淺談Spring refresh的工作流程,refresh 是 AbstractApplicationContext 中的一個方法,負責(zé)初始化 ApplicationContext容器,讓我們一起來學(xué)習(xí)一下吧

refresh 是 AbstractApplicationContext 中的一個方法,負責(zé)初始化 ApplicationContext 容器,容器必須調(diào)用 refresh 才能正常工作。它的內(nèi)部主要會調(diào)用 12 個方法,我們把它們稱為 refresh 的 12 個步驟:

1. prepareRefresh

2. obtainFreshBeanFactory

3. prepareBeanFactory

4. postProcessBeanFactory

5. invokeBeanFactoryPostProcessors

6. registerBeanPostProcessors

7. initMessageSource

8. initApplicationEventMulticaster

9. onRefresh

10. registerListeners

11. finishBeanFactoryInitialization

12. finishRefresh

功能分類

1 為準(zhǔn)備環(huán)境

2 3 4 5 6 為準(zhǔn)備 BeanFactory

7 8 9 10 12 為準(zhǔn)備 ApplicationContext

11 為初始化 BeanFactory 中非延遲單例 bean

具體步驟

1. prepareRefresh

* 這一步創(chuàng)建和準(zhǔn)備了 Environment 對象,它作為 ApplicationContext 的一個成員變量

* Environment 對象的作用之一是為后續(xù) @Value,值注入時提供鍵值

* Environment 分成三個主要部分

* systemProperties - 保存 java 環(huán)境鍵值

* systemEnvironment - 保存系統(tǒng)環(huán)境鍵值

* 自定義 PropertySource - 保存自定義鍵值,例如來自于 *.properties 文件的鍵值

2. obtainFreshBeanFactory

* 這一步獲取(或創(chuàng)建) BeanFactory,它也是作為 ApplicationContext 的一個成員變量

* BeanFactory 的作用是負責(zé) bean 的創(chuàng)建、依賴注入和初始化,bean 的各項特征由 BeanDefinition 定義

* BeanDefinition 作為 bean 的設(shè)計藍圖,規(guī)定了 bean 的特征,如單例多例、依賴關(guān)系、初始銷毀方法等

* BeanDefinition 的來源有多種多樣,可以是通過 xml 獲得、配置類獲得、組件掃描獲得,也可以是編程添加

* 所有的 BeanDefinition 會存入 BeanFactory 中的 beanDefinitionMap 集合

3. prepareBeanFactory

* 這一步會進一步完善 BeanFactory,為它的各項成員變量賦值

* beanExpressionResolver 用來解析 SpEL,常見實現(xiàn)為 StandardBeanExpressionResolver

* propertyEditorRegistrars 會注冊類型轉(zhuǎn)換器

* 它在這里使用了 ResourceEditorRegistrar 實現(xiàn)類

* 并應(yīng)用 ApplicationContext 提供的 Environment 完成 ${ } 解析

* registerResolvableDependency 來注冊 beanFactory 以及 ApplicationContext,讓它們也能用于依賴注入

* beanPostProcessors 是 bean 后處理器集合,會工作在 bean 的生命周期各個階段,此處會添加兩個:

* ApplicationContextAwareProcessor 用來解析 Aware 接口

* ApplicationListenerDetector 用來識別容器中 ApplicationListener 類型的 bean

4. postProcessBeanFactory

* 這一步是空實現(xiàn),留給子類擴展。

* 一般 Web 環(huán)境的 ApplicationContext 都要利用它注冊新的 Scope,完善 Web 下的 BeanFactory

* 這里體現(xiàn)的是模板方法設(shè)計模式

5. invokeBeanFactoryPost Processors

* 這一步會調(diào)用 beanFactory 后處理器

* beanFactory 后處理器,充當(dāng) beanFactory 的擴展點,可以用來補充或修改 BeanDefinition

* 常見的 beanFactory 后處理器有

* ConfigurationClassPostProcessor – 解析 @Configuration、@Bean、@Import、@PropertySource 等

* PropertySourcesPlaceHolderConfigurer – 替換 BeanDefinition 中的 ${ }

* MapperScannerConfigurer – 補充 Mapper 接口對應(yīng)的 BeanDefinition

6. registerBeanPost Processors

* 這一步是繼續(xù)從 beanFactory 中找出 bean 后處理器,添加至 beanPostProcessors 集合中

* bean 后處理器,充當(dāng) bean 的擴展點,可以工作在 bean 的實例化、依賴注入、初始化階段,常見的有:

* AutowiredAnnotationBeanPostProcessor 功能有:解析 @Autowired,@Value 注解

* CommonAnnotationBeanPostProcessor 功能有:解析 @Resource,@PostConstruct,@PreDestroy

* AnnotationAwareAspectJAutoProxyCreator 功能有:為符合切點的目標(biāo) bean 自動創(chuàng)建代理

7. initMessageSource

* 這一步是為 ApplicationContext 添加 messageSource 成員,實現(xiàn)國際化功能

* 去 beanFactory 內(nèi)找名為 messageSource 的 bean,如果沒有,則提供空的 MessageSource 實現(xiàn)

8. initApplication ContextEventMulticaster

* 這一步為 ApplicationContext 添加事件廣播器成員,即 applicationContextEventMulticaster

* 它的作用是發(fā)布事件給監(jiān)聽器

* 去 beanFactory 找名為 applicationEventMulticaster 的 bean 作為事件廣播器,若沒有,會創(chuàng)建默認的事件廣播器

* 之后就可以調(diào)用 ApplicationContext.publishEvent(事件對象) 來發(fā)布事件

9. onRefresh

* 這一步是空實現(xiàn),留給子類擴展

* SpringBoot 中的子類在這里準(zhǔn)備了 WebServer,即內(nèi)嵌 web 容器

* 體現(xiàn)的是模板方法設(shè)計模式

10. registerListeners

* 這一步會從多種途徑找到事件監(jiān)聽器,并添加至 applicationEventMulticaster

* 事件監(jiān)聽器顧名思義,用來接收事件廣播器發(fā)布的事件,有如下來源

* 事先編程添加的

* 來自容器中的 bean

* 來自于 @EventListener 的解析

* 要實現(xiàn)事件監(jiān)聽器,只需要實現(xiàn) ApplicationListener 接口,重寫其中 onApplicationEvent(E e) 方法即可

11. finishBeanFactory Initialization

* 這一步會將 beanFactory 的成員補充完畢,并初始化所有非延遲單例 bean

* conversionService 也是一套轉(zhuǎn)換機制,作為對 PropertyEditor 的補充

* embeddedValueResolvers 即內(nèi)嵌值解析器,用來解析 @Value 中的 ${ },借用的是 Environment 的功能

* singletonObjects 即單例池,緩存所有單例對象

* 對象的創(chuàng)建都分三個階段,每一階段都有不同的 bean 后處理器參與進來,擴展功能

12. finishRefresh

* 這一步會為 ApplicationContext 添加 lifecycleProcessor 成員,用來控制容器內(nèi)需要生命周期管理的 bean

* 如果容器中有名稱為 lifecycleProcessor 的 bean 就用它,否則創(chuàng)建默認的生命周期管理器

* 準(zhǔn)備好生命周期管理器,就可以實現(xiàn)

* 調(diào)用 context 的 start,即可觸發(fā)所有實現(xiàn) LifeCycle 接口 bean 的 start

* 調(diào)用 context 的 stop,即可觸發(fā)所有實現(xiàn) LifeCycle 接口 bean 的 stop

* 發(fā)布 ContextRefreshed 事件,整個 refresh 執(zhí)行完成

到此這篇關(guān)于淺談Spring refresh的工作流程的文章就介紹到這了,更多相關(guān)Spring refresh流程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Java中注解Annotation的定義、使用、解析

    淺談Java中注解Annotation的定義、使用、解析

    下面小編就為大家?guī)硪黄獪\談Java中注解Annotation的定義、使用、解析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • SpringMVC和rabbitmq集成的使用案例

    SpringMVC和rabbitmq集成的使用案例

    這篇文章主要介紹了SpringMVC和rabbitmq集成的使用案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • java日期格式化SimpleDateFormat的使用詳解

    java日期格式化SimpleDateFormat的使用詳解

    這篇文章主要介紹了java SimpleDateFormat使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Java 構(gòu)造器原理及用法解析

    Java 構(gòu)造器原理及用法解析

    這篇文章主要介紹了Java 構(gòu)造器原理及用法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • idea如何關(guān)閉右側(cè)類顯示方法

    idea如何關(guān)閉右側(cè)類顯示方法

    這篇文章主要介紹了idea如何關(guān)閉右側(cè)類顯示方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • mybatis中foreach嵌套if標(biāo)簽方式

    mybatis中foreach嵌套if標(biāo)簽方式

    這篇文章主要介紹了mybatis中foreach嵌套if標(biāo)簽方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中ArrayList的8種淺拷貝方式示例代碼

    Java中ArrayList的8種淺拷貝方式示例代碼

    這篇文章主要介紹了Java中ArrayList的8種淺拷貝方式的相關(guān)資料,講解了Java中ArrayList的淺拷貝概念,并詳細分享了八種實現(xiàn)淺拷貝的方法,可以幫助讀者更好地理解和選擇合適的淺拷貝方法,需要的朋友可以參考下
    2025-01-01
  • Java項目防止SQL注入的幾種方法總結(jié)

    Java項目防止SQL注入的幾種方法總結(jié)

    SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,在客戶端在向服務(wù)器發(fā)送請求的時候,sql命令通過表單提交或者url字符串拼接傳遞到后臺持久層,最終達到欺騙服務(wù)器執(zhí)行惡意的SQL命令,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java項目防止SQL注入的幾種方法,需要的朋友可以參考下
    2023-04-04
  • Java中CountDownLatch用法解析

    Java中CountDownLatch用法解析

    這篇文章主要為大家詳細介紹了Java中CountDownLatch用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • springboot結(jié)合vue實現(xiàn)增刪改查及分頁查詢

    springboot結(jié)合vue實現(xiàn)增刪改查及分頁查詢

    本文主要介紹了springboot結(jié)合vue實現(xiàn)增刪改查及分頁查詢,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論

合江县| 房产| 三明市| 石柱| 桐梓县| 离岛区| 天等县| 启东市| 湘乡市| 南木林县| 英山县| 子洲县| 孝感市| 桃江县| 绵阳市| 手机| 泊头市| 友谊县| 正定县| 栾城县| 中超| 高雄县| 关岭| 图木舒克市| 合肥市| 诸暨市| 连江县| 中超| 富宁县| 长寿区| 保康县| 蒙阴县| 西乌珠穆沁旗| 宿松县| 司法| 马边| 璧山县| 巴林右旗| 新平| 吉安市| 若尔盖县|