導語
上一篇我們瞭解對於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方法