教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢(xún)/投訴熱線(xiàn):400-618-4000

refresh是什么?Spring refresh的12個(gè)步驟

更新時(shí)間:2022年01月11日11時(shí)46分 來(lái)源:傳智教育 瀏覽次數:

refresh 是 AbstractApplicationContext 中的一個(gè)方法,負責初始化 ApplicationContext 容器,容器必須調用 refresh 才能正常工作。它的內部主要會(huì )調用 12 個(gè)方法,我們把它們稱(chēng)為 refresh 的 12 個(gè)步驟:

1. prepareRefresh

2. obtainFreshBeanFactory

3. prepareBeanFactory

4. postProcessBeanFactory

5. invokeBeanFactoryPostProcessors

6. registerBeanPostProcessors

7. initMessageSource

8. initApplicationEventMulticaster

9. onRefresh

10. registerListeners

11. finishBeanFactoryInitialization

12. finishRefresh

功能分類(lèi)

1 為準備環(huán)境

2 3 4 5 6 為準備 BeanFactory

7 8 9 10 12 為準備 ApplicationContext

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

具體步驟

1. prepareRefresh

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

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

* Environment 分成三個(gè)主要部分

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

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

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

1.prepareRefresh

2. obtainFreshBeanFactory

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

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

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

* BeanDefinition 的來(lái)源有多種多樣,可以是通過(guò) xml 獲得、配置類(lèi)獲得、組件掃描獲得,也可以是編程添加

* 所有的 BeanDefinition 會(huì )存入 BeanFactory 中的 beanDefinitionMap 集合

obtainFreshBeanFactory

3. prepareBeanFactory

* 這一步會(huì )進(jìn)一步完善 BeanFactory,為它的各項成員變量賦值

* beanExpressionResolver 用來(lái)解析 SpEL,常見(jiàn)實(shí)現為 StandardBeanExpressionResolver

* propertyEditorRegistrars 會(huì )注冊類(lèi)型轉換器

* 它在這里使用了 ResourceEditorRegistrar 實(shí)現類(lèi)

* 并應用 ApplicationContext 提供的 Environment 完成 ${ } 解析

* registerResolvableDependency 來(lái)注冊 beanFactory 以及 ApplicationContext,讓它們也能用于依賴(lài)注入

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

* ApplicationContextAwareProcessor 用來(lái)解析 Aware 接口

* ApplicationListenerDetector 用來(lái)識別容器中 ApplicationListener 類(lèi)型的 bean

prepareBeanFactory

4. postProcessBeanFactory

* 這一步是空實(shí)現,留給子類(lèi)擴展。

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

* 這里體現的是模板方法設計模式

5. invokeBeanFactoryPost Processors

* 這一步會(huì )調用 beanFactory 后處理器

* beanFactory 后處理器,充當 beanFactory 的擴展點(diǎn),可以用來(lái)補充或修改 BeanDefinition

* 常見(jiàn)的 beanFactory 后處理器有

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

* PropertySourcesPlaceHolderConfigurer – 替換 BeanDefinition 中的 ${ }

* MapperScannerConfigurer – 補充 Mapper 接口對應的 BeanDefinition

invokeBeanFactoryPostProcessors

6. registerBeanPost Processors

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

* bean 后處理器,充當 bean 的擴展點(diǎn),可以工作在 bean 的實(shí)例化、依賴(lài)注入、初始化階段,常見(jiàn)的有:

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

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

* AnnotationAwareAspectJAutoProxyCreator 功能有:為符合切點(diǎn)的目標 bean 自動(dòng)創(chuàng )建代理

registerBeanPostProcessors

7. initMessageSource

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

* 去 beanFactory 內找名為 messageSource 的 bean,如果沒(méi)有,則提供空的 MessageSource 實(shí)現

initMessageSource

8. initApplication ContextEventMulticaster

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

* 它的作用是發(fā)布事件給監聽(tīng)器

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

* 之后就可以調用 ApplicationContext.publishEvent(事件對象) 來(lái)發(fā)布事件

initApplicationContextEventMulticaster

9. onRefresh

* 這一步是空實(shí)現,留給子類(lèi)擴展

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

* 體現的是模板方法設計模式

10. registerListeners

* 這一步會(huì )從多種途徑找到事件監聽(tīng)器,并添加至 applicationEventMulticaster

* 事件監聽(tīng)器顧名思義,用來(lái)接收事件廣播器發(fā)布的事件,有如下來(lái)源

* 事先編程添加的

* 來(lái)自容器中的 bean

* 來(lái)自于 @EventListener 的解析

* 要實(shí)現事件監聽(tīng)器,只需要實(shí)現 ApplicationListener 接口,重寫(xiě)其中 onApplicationEvent(E e) 方法即可

registerListeners

11. finishBeanFactory Initialization

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

* conversionService 也是一套轉換機制,作為對 PropertyEditor 的補充

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

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

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

finishBeanFactoryInitialization

12. finishRefresh

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

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

* 準備好生命周期管理器,就可以實(shí)現

* 調用 context 的 start,即可觸發(fā)所有實(shí)現 LifeCycle 接口 bean 的 start

* 調用 context 的 stop,即可觸發(fā)所有實(shí)現 LifeCycle 接口 bean 的 stop

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

finishRefresh

猜你喜歡:

SpringBoot 2.X有什么新特性?與1.X有什么區別?

Spring Cloud Hystrix原理介紹

Spring MVC框架有哪些優(yōu)點(diǎn)?

Spring AOP實(shí)現原理和常見(jiàn)代理的區別

傳智教育java開(kāi)發(fā)培訓

0 分享到:
和我們在線(xiàn)交談!