spring步步前行(IOC)-Spring beanFactory詳解(三)

導語

上一篇我們瞭解對於beanPostProcessor和BeanFactoryPostProcessor,spring爲我們設置一些由我們自由控制的時機。接下來我們繼續我們的refresh方法分析

refresh的initMessageSource

在這裏插入圖片描述
這個方法就相對簡單,對beanFactory進行處理,分析如下

  • 如果包含有messageSource就從beanfactory中獲取且判斷這個messageSource是否是HierarchicalMessageSource,如果是,就這時其父級messageSource

  • 如果沒有,則新建DelegatingMessageSource作爲messageSource的bean

refresh的initApplicationEventMulticaster

在這裏插入圖片描述
此方法也相對簡單與initResource也很相似,分析如下:

  • 如果beanFactory中是否包含applicationEventMulticaster,就從beanFactory獲取applicationEventMulticaser
  • 若沒有,新建作爲單例的SimpleApplicationEventMulticaster

我們進入SimpleApplicationEventMulticaster
在這裏插入圖片描述
我們關注muticastEvent看看,從其父類根據ApplicationEvent獲取所有的applicationListeners,循環遍歷onApplicationEvent,從這裏我們可以類比觀察者模式,結合AbstractApplicationEventMulticaster,我們可以瞭解到保存所有的listener

refresh的onRefresh

此方法是空實現,是提供的可重寫以添加上下文特定刷新工作的模板方法,在初始化特殊bean時調用,在實例化單例之前

refresh的registerListeners

在這裏插入圖片描述
從之前的EventMulticaster中,我們知道spring的替我們初始化了一個事件處理器,而register就是向事件處理器中添加所有實現了ApplicationListener接口的類的觀察listener

refresh的finishBeanFactoryInitialization

從其註釋我們知道此方法是用於實例化所有非懶加載的所有bean
在這裏插入圖片描述

  • 首先查看是否有ConversionService在beanFactory中,如果有就向beanFactory中存放ConversionService

    public interface ConversionService {
        boolean canConvert(Class<?> var1, Class<?> var2);
    
        boolean canConvert(TypeDescriptor var1, TypeDescriptor var2);
    
        <T> T convert(Object var1, Class<T> var2);
    
        Object convert(Object var1, TypeDescriptor var2, TypeDescriptor var3);
    }
    從接口定義上看conversionService是用於一個服務接口用於類型轉換,這也是轉換系統的入口點
    
  • 從beanFactory中查找所有的LoadTimerWeaverAware,並實例化對應的LoadTimerWeaverAware

  • 停止臨時的classloader類加載器,然後緩存所有的beanDefinition數據,最後在preInstantiateSingleton中進行實例化non-lazy-init 單例

    對於preInstantiateSingleton:
    在這裏插入圖片描述

    • 首先beanDifinition賦值到一個新的集合中,緊接着進行遍歷操作
    • 如果不是lazyinit,也不是單例的且還是Abstract的就進行getMergedLocalBeanDefinition操作,獲取緩存的BeanDefinition對象併合並其父類和本身的屬性
      在這裏插入圖片描述
  • 接着判斷是否爲factoryBean,不是的話直接進行getBean進行實例化,若是,獲取factoryBean,查看factoryBean是否有額外配置

refresh的finishRefresh

首先官方註釋是

publish corresponding event

即:發佈所有的應用
在這裏插入圖片描述

  • initLifecycleProcessor,LifecycleProcessor實例初始化,LifecycleProcessor是所有Lifecycle實現類的管家,裏面包含了對Lifecycle的各種操作
    在這裏插入圖片描述
  • LifecycleProcessor的onRefresh,通過LifecycleProcessor來執行Lifecycle實現類的start方法
    在這裏插入圖片描述
    在這裏插入圖片描述
  • publishEvent,即Spring中的事件發佈機制來發出ContextRefreshedEvent事件
  • 最後registerApplicationContext,如果配置了MBeanServer,就完成在MBeanServer上的註冊

到這裏,整個refresh方法就分析結束了,可能有很多人還是有很多疑問,其實refresh方法是spring對bean操作外置的很多處理機制,後續會繼續針對refresh的這些方法,從不同的實例來換一些角度瞭解整個refresh方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章