Spring容器的refresh()【創(chuàng)建刷新】
prepareRefresh()
刷新前的預處理
- initPropertySource() 初始化一些屬性設置廷蓉,由子類自定義個性化的屬性設置
- getEnvironment().validateRequirProperties();檢查屬性的合法性,如一些必須要有的屬性是否存在
- earlyApplicationEvents=new LinkedHashSet<ApplicationEvent>()马昙;保存容器中的一些早期的事件
obtainFreshBeanFactory()
獲取BeanFactory;
- refreshBeanFactory();刷新【創(chuàng)建】BeanFactory;
創(chuàng)建了一個this.beanFactory=new DefaultListableBeanFactory();
對beanFactory設置序列化ID
【Spring 5 會優(yōu)先判斷beanFactory是否存在桃犬,存在就先進行清空beanFactory包含里面的bean,并調(diào)用bean的銷毀方法行楞,再重新new一個 DefaultListableBeanFactory對象作為當前beanFactory】 - getBeanFactory();返回剛才GenericApplicationContext創(chuàng)建的BeanFactory對象攒暇;
- 將創(chuàng)建BeanFactory【DefaultListableBeanFactory】返回
prepareBeanFactory(beanFactory);
BeanFactory的預準備工作(BeanFactory進行一些設置)
- 設置BeanFactory的類加載器,支持表達式解析器...
- 添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
- 設置忽略的自動裝配的接口EnvironmentAware,EmbeddedValueReslverAware,ResourceLoaderAware,ApplicationEventPublisherAware,MessageSourceAware,ApplicationContextAware,xxx;
- 注冊可以解析的自動裝配子房,我們能直接在任何組件中自動注入:BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext
- 添加BeanPostProcessor【ApplicationListenerDetector】【ApplicationListenerDetector就是用于將實現(xiàn)ApplicationListener的bean添加到ApplicationContext中】
- 添加編譯時的AspectJ
- 給BeanFactory中注冊一些能用的組件:environment【ConfigurableEnvironment】,systemProperties【Map<String,Object>】,systemEnviroment【Map<String,Object>】
postProcessBeanFactory(beanFactory);
BeanFactory準備工作完成后進行的后置處理工作形用;
- 子類通過重新這個方法來在BeanFactory創(chuàng)建并預準備完成以后做進一步的設置
================================以上是BeanFactory的創(chuàng)建以預準備工作============================
invokeBeanFactoryPostProcessors(beanFactory)
執(zhí)行BeanFactoryProcessor;
BeanFactoryPostProcessor:BeanFactory的后置處理器。在BeanFactory標準初始化之后執(zhí)行的证杭;
兩個接口:BeanFactoryPostProcessor田度,BeanDefinitionRegistryPostProcessor:
- 執(zhí)行BeanFactoryPostProcessor方法
先執(zhí)行BeanDefinitionRegistryPostProcessor:
1.獲取所有的BeanDefinitionRegistryPostProcessor;
2.看優(yōu)先級排序PriorityOrdered優(yōu)先級接口的BeanDefinitionRegistryPostProcessor;
postProcessor.postProcessBeanDefinitonRegistry(registry)
3.再執(zhí)行實現(xiàn)了Ordered順序接口的BeanDefinitionRegistryPostProcessor解愤;
postProcessor.postProcessBeanDefinitonRegistry(registry)
4.最后執(zhí)行沒有實現(xiàn)任何優(yōu)先級或是順序接口的BeanDefinitionRegistryPostProcessor;
postProcessor.postProcessBeanDefinitonRegistry(registry)
再執(zhí)行BeanFactoryPostProcessor
1.獲取所有的BeanFactoryPostProcessor;
2.看優(yōu)先級排序PriorityOrdered優(yōu)先級接口的BeanFactoryPostProcessor镇饺;
postProcessor.postPorcessBeanFactory()
3.再執(zhí)行實現(xiàn)了Ordered順序接口的BeanFactoryPostProcessor;
postProcessor.postPorcessBeanFactory()
4.最后執(zhí)行沒有實現(xiàn)任何優(yōu)先級或是順序接口的BeanFactoryPostProcessor;
postProcessor.postPorcessBeanFactory()
registerBeanPostProcessors(beanFactory)
注冊BeanPostProcessor(Bean的后置處理器)【intercept bean creation.】
不同接口類型的BeanPostProcessor;在Bean創(chuàng)建前后的執(zhí)行時機是不一樣的
BeanPostProcessor送讲,
DestructionAwareBeanPostProcessor奸笤,
InstantiationAwareBeanPostProcessor惋啃,
SmartInstantiationAwareBeanPostProcessor,
MergedBeanDefinitionPostProcessor【該方法由internalPostProcessors】
- 獲取所有的BeanPostProcessor揭保;后置處理器都默認可以通過PriorityOrdered,Ordered接口來執(zhí)行優(yōu)先級
- 先注冊PriorityOrdered優(yōu)先級接口的BeanPostProcessor
把每一個BeanPostProcessor肥橙;添加BeanFactory中
beanFactory.addBeanPostProcessor(postProcessor)魄宏; - 再注冊Ordered接口
- 最后注冊沒有實現(xiàn)任何優(yōu)先級接口的
- 最終注冊MergedBeanDefinitionPostProcessor秸侣;
- 注冊一個ApplicationListenerDetector來在Bean創(chuàng)建完成后檢查是否是ApplicationListener,如果是applicationContext.addApplicationListener(ApplicationListener<?>);
initMessageSource()
初始化MessageSource組件(做國際化功能;消息綁定宠互,消息解析)味榛;
- 獲取BeanFactory
- 看容器中是否有id為messageSource,類型是MessageSource的組件
如果有賦值給messageSource予跌,如果沒有自己創(chuàng)建一個DelegatingMessageSource搏色;
MessageSource:取出國際化配置文件中的某個key的值,能按照區(qū)域信息獲取 - 把創(chuàng)建好的MessageSource注冊在容器中券册,以后獲取國際化配置文件的時候频轿,可以自動注入MessageSource,然后調(diào)用它的getMessage方法實現(xiàn)國際化功能
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME,this.messageSource);
initApplicationEventMulticaster()
初始化事件派發(fā)器
- 獲取BeanFactory
- 從BeanFactory中獲取applicationEventMulticaster
- 如果上一步?jīng)]有配置烁焙;創(chuàng)建一個SimpleApplicationEventMulticaster
- 將創(chuàng)建的ApplcaitionEventMulticaster添加到BeanFactory中航邢,以后其他組件自動注入
onResfresh()
留給子容器(子類)
- 子類重寫這個方法,在容器刷新的時候可以自定義邏輯
regsisterListeners()
給容器中將所有項目里面的ApplicationListener注冊進來骄蝇;
- 從容器中拿到所有的ApplicationListener
- 將每個監(jiān)聽器添加到事件派發(fā)器中
getApplicationEventMulticaster().addApplicationListenerBean(listener); - 派發(fā)之前步驟產(chǎn)生的事件:
finsihBeanFactoryInitialization(beanFactory)
初始化所有剩下的單實例bean
- beanFactory.preInstantiateSingletons();初始化后剩下的單實例bean膳殷;
- 獲取容器中的所有bean,依次進行初始化和創(chuàng)建對象
- 獲取bean的定義信息:RootBeanDefinition
- Bean不是抽象的九火,是單實例的赚窃,不是懶加載:
- 判斷是否是FactoryBean,是否是實現(xiàn)FactoryBean接口的Bean
- 不是工廠Bean。利用getBean(beanName)岔激;創(chuàng)建對象
- getBean(beanName);ioc.getBean();
- doGetBean(name,null,null,false);
- 先獲取緩存中保存的單例Bean勒极。如果能獲取到說明這個bean之前被創(chuàng)建過(所有創(chuàng)建過的單實例bean都會被緩存起來)
從private final Map<String,Object> singletonObjects=new ConcurrentHashMap<>()獲取 - 緩存中獲取不到,開始Bean的創(chuàng)建對象流程
- 標記當前bean已經(jīng)被創(chuàng)建
- 獲取bean的定義信息
- 獲取當前bean依賴的其他bean虑鼎;如果按照getBean()把依賴的bean先創(chuàng)建出來辱匿。
- 啟動單實例bean的創(chuàng)建流程:
- createBean(bean,rootBeanDefinition,args);
- Object bean=resolveBeforeInstantiation(beanName,mbdToUser);讓BeanPostProcess先嘗試創(chuàng)建代理對象
InstantiationAwareBeanPostProcessor:提前執(zhí)行
先觸發(fā):postProcessBefroeInstantiation();
如果有返回值:觸發(fā)postProcessAfterInitialization(); - 如果前面的InstantiationAwareBeanPostProcessor沒有返回代理對象:
- Object beanInstance=doCreateBean(beanName,mbdToUse,args);
- 創(chuàng)建Bean實例,createBeanInstance(beanName,rootBeanDefinition,args);
利用工廠方法或者對象的構造器創(chuàng)建出Bean的實例 - applyMergedBeanDefinitionPostProcessor(rootBeanDefinition,beanType,beanName);
調(diào)用MergedBeanDefinitionPostPorcessor的postProcessMergedBeanDefinition方法。 - 【Bean屬性賦值】populateBean(beanName,beanDefinition,instanceWrapper);
1.拿到InstantiationAwareBeanPostProcessor后置處理器:postProcessAfterInstantiation();
2.拿到InstantiationAwareBeanPostProcessor后置處理器:
postProcessPropertyValues();- 應用Bean屬性的值;為屬性利用setter方法等進行賦值:applyPropertyValues(beanName,beanDefinition,beanWrapper,propertyValues);
- 【Bean初始化】initializeBean(beanName,exposedObject,beanDefinition);
- 【執(zhí)行Aware接口方法】invokeAwareMethods(beanName,bean);執(zhí)行xxxAware接口方法:BeanNameAware\BeanClassLoaderAware\BeanFactoryAware
- 【執(zhí)行后置處理器】:applyBeanPostProcessorsBeforeInsitalization(wrappedBean,beanName)
BeanPostProcessor.postProcessBeforeInitiaization() - 【執(zhí)行初始化方法】invokeInitMethods(beanName,wrappedName,beanDefinition);
1. 是否是InitializingBean接口實現(xiàn)计维;執(zhí)行接口規(guī)定的初始化
2.是否自定義初始化方法霜医; - 【執(zhí)行后置處理器初始化之后】applyBeanPostProcessorsAfterInitalization
BeanPostProcessor.postProcessAfterInitiaization() - 注冊Beande銷毀方法
- 創(chuàng)建Bean實例,createBeanInstance(beanName,rootBeanDefinition,args);
- 將創(chuàng)建的Bean添加到緩存中singletonObjects;
ioc容器就是這個Map,很多的Map里面保存了單實例Bean霉旗,環(huán)境信息..
所有Bean都利用genBean創(chuàng)建完成以后;
檢查所有Bean是否是SmartInitializingSingleton接口;如果是扔嵌,就執(zhí)行afterSingletonsInstantiation
finishRefresh()
完成BeanFactory的初始化創(chuàng)建工作限府,IOC容器就創(chuàng)建完成;
- initLifecycleProcessor();初始化和生命周期有關的后置處理器痢缎;LifecycleProessor.
默認從容器中找是否有l(wèi)ifecycleProcessor的組件【LifecycleProessor】;如果沒有new DefaultLifecycleProcessor,并加入都容器中胁勺。
實現(xiàn)一個LifecycleProcessor類,beanFactory在此方法回調(diào)LifecycleProcessor的onRefresh()方法独旷,當beanFactory銷毀時候署穗,會回調(diào)onClose()方法; - getLifecycleProcessor().onRefresh();
拿到前面定義的生命周期處理器(beanFactory);回調(diào)onRefresh(); - publishEvent(new ContextRefreshedEvent(this));發(fā)布容器刷新完成事件
- liveBeanView.regsiterApplicationContext(this);
總結
- Spring容器在啟動的時候嵌洼,先會保存所有注冊進來的Bean定義信息
- xml注冊bean:<bean>
- 注解注冊Bean:@Service案疲,@Component,@Bean
- Spring容器會合適的時機創(chuàng)建這些Bean
- 用到這個bean的時候麻养;利用genBean創(chuàng)建bean褐啡;創(chuàng)建好以后保存在容器中;
- 統(tǒng)一創(chuàng)建剩下所有的bean的時候鳖昌;finishBeanFactoryInitialization();
- 后置處理器
每一個bean創(chuàng)建完成备畦,都會使用各種后置處理進行處理;來增強bean的功能许昨;
AutowiredAnntationBeanPortProcessor:處理自動注入
AnnotationAwareAspectJAutoProxyCreate:來做AOP功能懂盐;
xxx...
增強的功能注解
AsyncAnnotationBeanProcessor
...... - 事件驅動模型:
ApplicationListener:事件監(jiān)聽;
ApplicationEventMulticaster:事件派發(fā)车要;