Spring容器的refresh()【創(chuàng)建刷新】
prepareRefresh()
刷新前的預(yù)處理
- initPropertySource() 初始化一些屬性設(shè)置,由子類自定義個(gè)性化的屬性設(shè)置
- getEnvironment().validateRequirProperties();檢查屬性的合法性,如一些必須要有的屬性是否存在
- earlyApplicationEvents=new LinkedHashSet<ApplicationEvent>();保存容器中的一些早期的事件
obtainFreshBeanFactory()
獲取BeanFactory;
- refreshBeanFactory();刷新【創(chuàng)建】BeanFactory;
創(chuàng)建了一個(gè)this.beanFactory=new DefaultListableBeanFactory();
對(duì)beanFactory設(shè)置序列化ID
【Spring 5 會(huì)優(yōu)先判斷beanFactory是否存在,存在就先進(jìn)行清空beanFactory包含里面的bean,并調(diào)用bean的銷毀方法,再重新new一個(gè) DefaultListableBeanFactory對(duì)象作為當(dāng)前beanFactory】 - getBeanFactory();返回剛才GenericApplicationContext創(chuàng)建的BeanFactory對(duì)象;
- 將創(chuàng)建BeanFactory【DefaultListableBeanFactory】返回
prepareBeanFactory(beanFactory);
BeanFactory的預(yù)準(zhǔn)備工作(BeanFactory進(jìn)行一些設(shè)置)
- 設(shè)置BeanFactory的類加載器,支持表達(dá)式解析器...
- 添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
- 設(shè)置忽略的自動(dòng)裝配的接口EnvironmentAware,EmbeddedValueReslverAware,ResourceLoaderAware,ApplicationEventPublisherAware,MessageSourceAware,ApplicationContextAware,xxx;
- 注冊(cè)可以解析的自動(dòng)裝配,我們能直接在任何組件中自動(dòng)注入:BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext
- 添加BeanPostProcessor【ApplicationListenerDetector】【ApplicationListenerDetector就是用于將實(shí)現(xiàn)ApplicationListener的bean添加到ApplicationContext中】
- 添加編譯時(shí)的AspectJ
- 給BeanFactory中注冊(cè)一些能用的組件:environment【ConfigurableEnvironment】,systemProperties【Map<String,Object>】,systemEnviroment【Map<String,Object>】
postProcessBeanFactory(beanFactory);
BeanFactory準(zhǔn)備工作完成后進(jìn)行的后置處理工作;
- 子類通過重新這個(gè)方法來在BeanFactory創(chuàng)建并預(yù)準(zhǔn)備完成以后做進(jìn)一步的設(shè)置
================================以上是BeanFactory的創(chuàng)建以預(yù)準(zhǔn)備工作============================
invokeBeanFactoryPostProcessors(beanFactory)
執(zhí)行BeanFactoryProcessor;
BeanFactoryPostProcessor:BeanFactory的后置處理器。在BeanFactory標(biāo)準(zhǔn)初始化之后執(zhí)行的;
兩個(gè)接口:BeanFactoryPostProcessor,BeanDefinitionRegistryPostProcessor:
- 執(zhí)行BeanFactoryPostProcessor方法
先執(zhí)行BeanDefinitionRegistryPostProcessor:
1.獲取所有的BeanDefinitionRegistryPostProcessor;
2.看優(yōu)先級(jí)排序PriorityOrdered優(yōu)先級(jí)接口的BeanDefinitionRegistryPostProcessor;
postProcessor.postProcessBeanDefinitonRegistry(registry)
3.再執(zhí)行實(shí)現(xiàn)了Ordered順序接口的BeanDefinitionRegistryPostProcessor;
postProcessor.postProcessBeanDefinitonRegistry(registry)
4.最后執(zhí)行沒有實(shí)現(xiàn)任何優(yōu)先級(jí)或是順序接口的BeanDefinitionRegistryPostProcessor;
postProcessor.postProcessBeanDefinitonRegistry(registry)
再執(zhí)行BeanFactoryPostProcessor
1.獲取所有的BeanFactoryPostProcessor;
2.看優(yōu)先級(jí)排序PriorityOrdered優(yōu)先級(jí)接口的BeanFactoryPostProcessor;
postProcessor.postPorcessBeanFactory()
3.再執(zhí)行實(shí)現(xiàn)了Ordered順序接口的BeanFactoryPostProcessor;
postProcessor.postPorcessBeanFactory()
4.最后執(zhí)行沒有實(shí)現(xiàn)任何優(yōu)先級(jí)或是順序接口的BeanFactoryPostProcessor;
postProcessor.postPorcessBeanFactory()
registerBeanPostProcessors(beanFactory)
注冊(cè)BeanPostProcessor(Bean的后置處理器)【intercept bean creation.】
不同接口類型的BeanPostProcessor;在Bean創(chuàng)建前后的執(zhí)行時(shí)機(jī)是不一樣的
BeanPostProcessor,
DestructionAwareBeanPostProcessor,
InstantiationAwareBeanPostProcessor,
SmartInstantiationAwareBeanPostProcessor,
MergedBeanDefinitionPostProcessor【該方法由internalPostProcessors】
- 獲取所有的BeanPostProcessor;后置處理器都默認(rèn)可以通過PriorityOrdered,Ordered接口來執(zhí)行優(yōu)先級(jí)
- 先注冊(cè)PriorityOrdered優(yōu)先級(jí)接口的BeanPostProcessor
把每一個(gè)BeanPostProcessor;添加BeanFactory中
beanFactory.addBeanPostProcessor(postProcessor); - 再注冊(cè)O(shè)rdered接口
- 最后注冊(cè)沒有實(shí)現(xiàn)任何優(yōu)先級(jí)接口的
- 最終注冊(cè)MergedBeanDefinitionPostProcessor;
- 注冊(cè)一個(gè)ApplicationListenerDetector來在Bean創(chuàng)建完成后檢查是否是ApplicationListener,如果是applicationContext.addApplicationListener(ApplicationListener<?>);
initMessageSource()
初始化MessageSource組件(做國際化功能;消息綁定,消息解析);
- 獲取BeanFactory
- 看容器中是否有id為messageSource,類型是MessageSource的組件
如果有賦值給messageSource,如果沒有自己創(chuàng)建一個(gè)DelegatingMessageSource;
MessageSource:取出國際化配置文件中的某個(gè)key的值,能按照區(qū)域信息獲取 - 把創(chuàng)建好的MessageSource注冊(cè)在容器中,以后獲取國際化配置文件的時(shí)候,可以自動(dòng)注入MessageSource,然后調(diào)用它的getMessage方法實(shí)現(xiàn)國際化功能
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME,this.messageSource);
initApplicationEventMulticaster()
初始化事件派發(fā)器
- 獲取BeanFactory
- 從BeanFactory中獲取applicationEventMulticaster
- 如果上一步?jīng)]有配置;創(chuàng)建一個(gè)SimpleApplicationEventMulticaster
- 將創(chuàng)建的ApplcaitionEventMulticaster添加到BeanFactory中,以后其他組件自動(dòng)注入
onResfresh()
留給子容器(子類)
- 子類重寫這個(gè)方法,在容器刷新的時(shí)候可以自定義邏輯
regsisterListeners()
給容器中將所有項(xiàng)目里面的ApplicationListener注冊(cè)進(jìn)來;
- 從容器中拿到所有的ApplicationListener
- 將每個(gè)監(jiān)聽器添加到事件派發(fā)器中
getApplicationEventMulticaster().addApplicationListenerBean(listener); - 派發(fā)之前步驟產(chǎn)生的事件:
finsihBeanFactoryInitialization(beanFactory)
初始化所有剩下的單實(shí)例bean
- beanFactory.preInstantiateSingletons();初始化后剩下的單實(shí)例bean;
- 獲取容器中的所有bean,依次進(jìn)行初始化和創(chuàng)建對(duì)象
- 獲取bean的定義信息:RootBeanDefinition
- Bean不是抽象的,是單實(shí)例的,不是懶加載:
- 判斷是否是FactoryBean,是否是實(shí)現(xiàn)FactoryBean接口的Bean
- 不是工廠Bean。利用getBean(beanName);創(chuàng)建對(duì)象
- getBean(beanName);ioc.getBean();
- doGetBean(name,null,null,false);
- 先獲取緩存中保存的單例Bean。如果能獲取到說明這個(gè)bean之前被創(chuàng)建過(所有創(chuàng)建過的單實(shí)例bean都會(huì)被緩存起來)
從private final Map<String,Object> singletonObjects=new ConcurrentHashMap<>()獲取 - 緩存中獲取不到,開始Bean的創(chuàng)建對(duì)象流程
- 標(biāo)記當(dāng)前bean已經(jīng)被創(chuàng)建
- 獲取bean的定義信息
- 獲取當(dāng)前bean依賴的其他bean;如果按照getBean()把依賴的bean先創(chuàng)建出來。
- 啟動(dòng)單實(shí)例bean的創(chuàng)建流程:
- createBean(bean,rootBeanDefinition,args);
- Object bean=resolveBeforeInstantiation(beanName,mbdToUser);讓BeanPostProcess先嘗試創(chuàng)建代理對(duì)象
InstantiationAwareBeanPostProcessor:提前執(zhí)行
先觸發(fā):postProcessBefroeInstantiation();
如果有返回值:觸發(fā)postProcessAfterInitialization(); - 如果前面的InstantiationAwareBeanPostProcessor沒有返回代理對(duì)象:
- Object beanInstance=doCreateBean(beanName,mbdToUse,args);
- 創(chuàng)建Bean實(shí)例,createBeanInstance(beanName,rootBeanDefinition,args);
利用工廠方法或者對(duì)象的構(gòu)造器創(chuàng)建出Bean的實(shí)例 - applyMergedBeanDefinitionPostProcessor(rootBeanDefinition,beanType,beanName);
調(diào)用MergedBeanDefinitionPostPorcessor的postProcessMergedBeanDefinition方法。 - 【Bean屬性賦值】populateBean(beanName,beanDefinition,instanceWrapper);
1.拿到InstantiationAwareBeanPostProcessor后置處理器:postProcessAfterInstantiation();
2.拿到InstantiationAwareBeanPostProcessor后置處理器:
postProcessPropertyValues();- 應(yīng)用Bean屬性的值;為屬性利用setter方法等進(jìn)行賦值: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接口實(shí)現(xiàn);執(zhí)行接口規(guī)定的初始化
2.是否自定義初始化方法; - 【執(zhí)行后置處理器初始化之后】applyBeanPostProcessorsAfterInitalization
BeanPostProcessor.postProcessAfterInitiaization() - 注冊(cè)Beande銷毀方法
- 創(chuàng)建Bean實(shí)例,createBeanInstance(beanName,rootBeanDefinition,args);
- 將創(chuàng)建的Bean添加到緩存中singletonObjects;
ioc容器就是這個(gè)Map,很多的Map里面保存了單實(shí)例Bean,環(huán)境信息..
所有Bean都利用genBean創(chuàng)建完成以后;
檢查所有Bean是否是SmartInitializingSingleton接口;如果是,就執(zhí)行afterSingletonsInstantiation
finishRefresh()
完成BeanFactory的初始化創(chuàng)建工作,IOC容器就創(chuàng)建完成;
- initLifecycleProcessor();初始化和生命周期有關(guān)的后置處理器;LifecycleProessor.
默認(rèn)從容器中找是否有l(wèi)ifecycleProcessor的組件【LifecycleProessor】;如果沒有new DefaultLifecycleProcessor,并加入都容器中。
實(shí)現(xiàn)一個(gè)LifecycleProcessor類,beanFactory在此方法回調(diào)LifecycleProcessor的onRefresh()方法,當(dāng)beanFactory銷毀時(shí)候,會(huì)回調(diào)onClose()方法; - getLifecycleProcessor().onRefresh();
拿到前面定義的生命周期處理器(beanFactory);回調(diào)onRefresh(); - publishEvent(new ContextRefreshedEvent(this));發(fā)布容器刷新完成事件
- liveBeanView.regsiterApplicationContext(this);
總結(jié)
- Spring容器在啟動(dòng)的時(shí)候,先會(huì)保存所有注冊(cè)進(jìn)來的Bean定義信息
- xml注冊(cè)bean:<bean>
- 注解注冊(cè)Bean:@Service,@Component,@Bean
- Spring容器會(huì)合適的時(shí)機(jī)創(chuàng)建這些Bean
- 用到這個(gè)bean的時(shí)候;利用genBean創(chuàng)建bean;創(chuàng)建好以后保存在容器中;
- 統(tǒng)一創(chuàng)建剩下所有的bean的時(shí)候;finishBeanFactoryInitialization();
- 后置處理器
每一個(gè)bean創(chuàng)建完成,都會(huì)使用各種后置處理進(jìn)行處理;來增強(qiáng)bean的功能;
AutowiredAnntationBeanPortProcessor:處理自動(dòng)注入
AnnotationAwareAspectJAutoProxyCreate:來做AOP功能;
xxx...
增強(qiáng)的功能注解
AsyncAnnotationBeanProcessor
...... - 事件驅(qū)動(dòng)模型:
ApplicationListener:事件監(jiān)聽;
ApplicationEventMulticaster:事件派發(fā);