您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Spring refresh的工作流程是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Spring refresh的工作流程是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
refresh 是 AbstractApplicationContext 中的一個方法,負責初始化 ApplicationContext 容器,容器必須調用 refresh 才能正常工作。它的內部主要會調用 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 為準備環境
2 3 4 5 6 為準備 BeanFactory
7 8 9 10 12 為準備 ApplicationContext
11 為初始化 BeanFactory 中非延遲單例 bean
* 這一步創建和準備了 Environment 對象,它作為 ApplicationContext 的一個成員變量
* Environment 對象的作用之一是為后續 @Value,值注入時提供鍵值
* Environment 分成三個主要部分
* systemProperties - 保存 java 環境鍵值
* systemEnvironment - 保存系統環境鍵值
* 自定義 PropertySource - 保存自定義鍵值,例如來自于 *.properties 文件的鍵值
* 這一步獲取(或創建) BeanFactory,它也是作為 ApplicationContext 的一個成員變量
* BeanFactory 的作用是負責 bean 的創建、依賴注入和初始化,bean 的各項特征由 BeanDefinition 定義
* BeanDefinition 作為 bean 的設計藍圖,規定了 bean 的特征,如單例多例、依賴關系、初始銷毀方法等
* BeanDefinition 的來源有多種多樣,可以是通過 xml 獲得、配置類獲得、組件掃描獲得,也可以是編程添加
* 所有的 BeanDefinition 會存入 BeanFactory 中的 beanDefinitionMap 集合
* 這一步會進一步完善 BeanFactory,為它的各項成員變量賦值
* beanExpressionResolver 用來解析 SpEL,常見實現為 StandardBeanExpressionResolver
* propertyEditorRegistrars 會注冊類型轉換器
* 它在這里使用了 ResourceEditorRegistrar 實現類
* 并應用 ApplicationContext 提供的 Environment 完成 ${ } 解析
* registerResolvableDependency 來注冊 beanFactory 以及 ApplicationContext,讓它們也能用于依賴注入
* beanPostProcessors 是 bean 后處理器集合,會工作在 bean 的生命周期各個階段,此處會添加兩個:
* ApplicationContextAwareProcessor 用來解析 Aware 接口
* ApplicationListenerDetector 用來識別容器中 ApplicationListener 類型的 bean
* 這一步是空實現,留給子類擴展。
* 一般 Web 環境的 ApplicationContext 都要利用它注冊新的 Scope,完善 Web 下的 BeanFactory
* 這里體現的是模板方法設計模式
* 這一步會調用 beanFactory 后處理器
* beanFactory 后處理器,充當 beanFactory 的擴展點,可以用來補充或修改 BeanDefinition
* 常見的 beanFactory 后處理器有
* ConfigurationClassPostProcessor – 解析 @Configuration、@Bean、@Import、@PropertySource 等
* PropertySourcesPlaceHolderConfigurer – 替換 BeanDefinition 中的 ${ }
* MapperScannerConfigurer – 補充 Mapper 接口對應的 BeanDefinition
* 這一步是繼續從 beanFactory 中找出 bean 后處理器,添加至 beanPostProcessors 集合中
* bean 后處理器,充當 bean 的擴展點,可以工作在 bean 的實例化、依賴注入、初始化階段,常見的有:
* AutowiredAnnotationBeanPostProcessor 功能有:解析 @Autowired,@Value 注解
* CommonAnnotationBeanPostProcessor 功能有:解析 @Resource,@PostConstruct,@PreDestroy
* AnnotationAwareAspectJAutoProxyCreator 功能有:為符合切點的目標 bean 自動創建代理
* 這一步是為 ApplicationContext 添加 messageSource 成員,實現國際化功能
* 去 beanFactory 內找名為 messageSource 的 bean,如果沒有,則提供空的 MessageSource 實現
* 這一步為 ApplicationContext 添加事件廣播器成員,即 applicationContextEventMulticaster
* 它的作用是發布事件給監聽器
* 去 beanFactory 找名為 applicationEventMulticaster 的 bean 作為事件廣播器,若沒有,會創建默認的事件廣播器
* 之后就可以調用 ApplicationContext.publishEvent(事件對象) 來發布事件
* 這一步是空實現,留給子類擴展
* SpringBoot 中的子類在這里準備了 WebServer,即內嵌 web 容器
* 體現的是模板方法設計模式
* 這一步會從多種途徑找到事件監聽器,并添加至 applicationEventMulticaster
* 事件監聽器顧名思義,用來接收事件廣播器發布的事件,有如下來源
* 事先編程添加的
* 來自容器中的 bean
* 來自于 @EventListener 的解析
* 要實現事件監聽器,只需要實現 ApplicationListener 接口,重寫其中 onApplicationEvent(E e) 方法即可
* 這一步會將 beanFactory 的成員補充完畢,并初始化所有非延遲單例 bean
* conversionService 也是一套轉換機制,作為對 PropertyEditor 的補充
* embeddedValueResolvers 即內嵌值解析器,用來解析 @Value 中的 ${ },借用的是 Environment 的功能
* singletonObjects 即單例池,緩存所有單例對象
* 對象的創建都分三個階段,每一階段都有不同的 bean 后處理器參與進來,擴展功能
* 這一步會為 ApplicationContext 添加 lifecycleProcessor 成員,用來控制容器內需要生命周期管理的 bean
* 如果容器中有名稱為 lifecycleProcessor 的 bean 就用它,否則創建默認的生命周期管理器
* 準備好生命周期管理器,就可以實現
* 調用 context 的 start,即可觸發所有實現 LifeCycle 接口 bean 的 start
* 調用 context 的 stop,即可觸發所有實現 LifeCycle 接口 bean 的 stop
* 發布 ContextRefreshed 事件,整個 refresh 執行完成
讀到這里,這篇“Spring refresh的工作流程是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。