1.整體流程概覽
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
this();
register(annotatedClasses);
refresh();
}
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
2.具體各步驟的工作
2.1、prepareRefresh()
刷新前的預處理
1)initPropertySources()初始化一些屬性設置;子類自定義個性化的屬性設置方法;
2)getEnvironment().validateRequiredProperties();檢驗屬性的合法等
3)earlyApplicationEvents= new LinkedHashSet<ApplicationEvent>();保存容器中的一些早期的事件;
2.2 obtainFreshBeanFactory()
獲取BeanFactory
1)refreshBeanFactory();刷新【創(chuàng)建】BeanFactory;
110行:創(chuàng)建了一個this.beanFactory = new DefaultListableBeanFactory();
設置id;
2)getBeanFactory();返回剛才GenericApplicationContext創(chuàng)建的BeanFactory對象;
3)將創(chuàng)建的BeanFactory【DefaultListableBeanFactory】返回;
2.3 prepareBeanFactory(beanFactory)
BeanFactory的預準備工作(以上創(chuàng)建了beanFactory,現(xiàn)在對BeanFactory對象進行一些設置屬性)
1)設置BeanFactory的類加載器、支持表達式解析器...
2)添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
3)設置忽略的自動裝配的接口EnvironmentAware、EmbeddedValueResolverAware、xxx;
4)注冊可以解析的自動裝配;我們能直接在任何組件中自動注入:
BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
5)添加BeanPostProcessor【ApplicationListenerDetector】
6)添加編譯時的AspectJ;
7)給BeanFactory中注冊一些能用的組件;
environment【ConfigurableEnvironment】、
systemProperties【Map<String, Object>】、
systemEnvironment【Map<String, Object>】
2.4、postProcessBeanFactory(beanFactory)
BeanFactory準備工作完成后進行的后置處理工作
1)子類通過重寫這個方法來在BeanFactory創(chuàng)建并預準備完成以后做進一步的設置
2.5、invokeBeanFactoryPostProcessors(beanFactory)
執(zhí)行BeanFactoryPostProcessor的方法
BeanFactoryPostProcessor:BeanFactory的后置處理器。在BeanFactory標準初始化之后執(zhí)行的;
兩個接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
1)先執(zhí)行BeanDefinitionRegistryPostProcessor
?1-1)83行:獲取所有的BeanDefinitionRegistryPostProcessor;
?1-2)86行:看先執(zhí)行實現(xiàn)了PriorityOrdered優(yōu)先級接口的BeanDefinitionRegistryPostProcessor、postProcessor.postProcessBeanDefinitionRegistry(registry)
?1-3)99行:在執(zhí)行實現(xiàn)了Ordered順序接口的BeanDefinitionRegistryPostProcessor;
postProcessor.postProcessBeanDefinitionRegistry(registry)
?1-4)109行:最后執(zhí)行沒有實現(xiàn)任何優(yōu)先級或者是順序接口的BeanDefinitionRegistryPostProcessors;postProcessor.postProcessBeanDefinitionRegistry(registry)
2)再執(zhí)行BeanFactoryPostProcessor的方法
?2-1)139行:獲取所有的BeanFactoryPostProcessor
?2-2)147行:看先執(zhí)行實現(xiàn)了PriorityOrdered優(yōu)先級接口的BeanFactoryPostProcessor、postProcessor.postProcessBeanFactory()
?2-3)167行:在執(zhí)行實現(xiàn)了Ordered順序接口的BeanFactoryPostProcessor;postProcessor.postProcessBeanFactory()
?2-4)175行:最后執(zhí)行沒有實現(xiàn)任何優(yōu)先級或者是順序接口的BeanFactoryPostProcessor;postProcessor.postProcessBeanFactory()
2.6、registerBeanPostProcessors(beanFactory)
注冊BeanPostProcessor(Bean的后置處理器)【 intercept bean creation】
不同接口類型的BeanPostProcessor;在Bean創(chuàng)建前后的執(zhí)行時機是不一樣的
?BeanPostProcessor、
?DestructionAwareBeanPostProcessor、
?InstantiationAwareBeanPostProcessor、(AOP和事務)
?SmartInstantiationAwareBeanPostProcessor、
?MergedBeanDefinitionPostProcessor【internalPostProcessors】、
1)189行:獲取所有的 BeanPostProcessor;后置處理器都默認可以通過PriorityOrdered、Ordered接口來執(zhí)行優(yōu)先級
2)204行:先注冊PriorityOrdered優(yōu)先級接口的BeanPostProcessor;把每一個BeanPostProcessor;添加到BeanFactory中beanFactory.addBeanPostProcessor(postProcessor);
3)224行:再注冊Ordered接口的
4)236行:最后注冊沒有實現(xiàn)任何優(yōu)先級接口的
5)最終注冊MergedBeanDefinitionPostProcessor;
6)注冊一個ApplicationListenerDetector;來在Bean創(chuàng)建完成后檢查是否是ApplicationListener,如果是applicationContext.addApplicationListener((ApplicationListener<?>) bean);
2.7、initMessageSource()
初始化MessageSource組件(做國際化功能;消息綁定,消息解析)
1)718行:獲取BeanFactory
2)719行:看容器中是否有id為messageSource的,類型是MessageSource的組件
?如果有賦值給messageSource,如果沒有自己創(chuàng)建一個DelegatingMessageSource;
?MessageSource:取出國際化配置文件中的某個key的值;能按照區(qū)域信息獲?。?br>
3)739行:把創(chuàng)建好的MessageSource注冊在容器中,以后獲取國際化配置文件的值的時候,可以自動注入MessageSource;
?beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
?MessageSource.getMessage(String code, Object[] args, String defaultMessage, Locale locale);以后可通過getMessage獲取
2.8、initApplicationEventMulticaster()
初始化事件派發(fā)器
1)753行:獲取BeanFactory
2)754行:從BeanFactory中獲取applicationEventMulticaster的ApplicationEventMulticaster;
3)762行:如果上一步?jīng)]有配置;創(chuàng)建一個SimpleApplicationEventMulticaster
4)763行:將創(chuàng)建的ApplicationEventMulticaster添加到BeanFactory中,以后其他組件直接自動注入
2.9、onRefresh()
留給子容器(子類)
1)子類重寫這個方法,在容器刷新的時候可以自定義邏輯;
2.10 registerListeners()
給容器中將所有項目里面的ApplicationListener注冊進來
1)822行:從容器中拿到所有的ApplicationListener
2)824行:將每個監(jiān)聽器添加到事件派發(fā)器中;
?getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
3)832行:派發(fā)之前步驟產(chǎn)生的事件;
2.11 finishBeanFactoryInitialization(beanFactory)
初始化所有剩下的單實例bean
867行:beanFactory.preInstantiateSingletons();初始化后剩下的單實例bean
1)734行:獲取容器中的所有Bean,依次進行初始化和創(chuàng)建對象
2)738行:獲取Bean的定義信息;RootBeanDefinition
3)739行:Bean不是抽象的,是單實例的,是懶加載;
3-1)740行:判斷是否是FactoryBean;是否是實現(xiàn)FactoryBean接口的Bean;
3-2)760行:不是工廠Bean。利用getBean(beanName);創(chuàng)建對象
3-2-0)199行:getBean(beanName); ioc.getBean();
3-2-1)doGetBean(name, null, null, false);
3-2-2)246行: getSingleton(beanName)先獲取緩存中保存的單實例Bean《跟進去其實就是從MAP中拿》。如果能獲取到說明這個Bean之前被創(chuàng)建過(所有創(chuàng)建過的單實例Bean都會被緩存起來)
從private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);獲取的
3-2-3)緩存中獲取不到,開始Bean的創(chuàng)建對象流程;
3-2-4)287行:標記當前bean已經(jīng)被創(chuàng)建(防止多線程同時創(chuàng)建,使用synchronized)
3-2-5)291行:獲取Bean的定義信息;
3-2-6)295行:getDependsOn(),bean.xml里創(chuàng)建person時,加depend-on="jeep,moon"是先把jeep和moon創(chuàng)建出來
【獲取當前Bean依賴的其他Bean;如果有按照getBean()把依賴的Bean先創(chuàng)建出來;】
3-2-7)啟動單實例Bean的創(chuàng)建流程;
3-2-7-1)462行:createBean(beanName, mbd, args);
3-2-7-2)490行:Object bean = resolveBeforeInstantiation(beanName, mbdToUse);讓BeanPostProcessor先攔截返回代理對象;
【InstantiationAwareBeanPostProcessor】:提前執(zhí)行;
先觸發(fā):postProcessBeforeInstantiation();
如果有返回值:觸發(fā)postProcessAfterInitialization();
3-2-7-3)如果前面的InstantiationAwareBeanPostProcessor沒有返回代理對象;調(diào)用4)
3-2-7-4)501行:Object beanInstance = doCreateBean(beanName, mbdToUse, args);創(chuàng)建Bean
a)541行:【創(chuàng)建Bean實例】;createBeanInstance(beanName, mbd, args);
利用工廠方法或者對象的構造器創(chuàng)建出Bean實例;
b)applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
調(diào)用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd, beanType, beanName);
c)578行:【Bean屬性賦值】populateBean(beanName, mbd, instanceWrapper);
賦值之前:
c-1)拿到InstantiationAwareBeanPostProcessor后置處理器;
1305行:postProcessAfterInstantiation();
c-2)拿到InstantiationAwareBeanPostProcessor后置處理器;
1348行:postProcessPropertyValues();
=====賦值之前:===
c-3)應用Bean屬性的值;為屬性利用setter方法等進行賦值;
applyPropertyValues(beanName, mbd, bw, pvs);
d)【Bean初始化】initializeBean(beanName, exposedObject, mbd);
d-1)1693行:【執(zhí)行Aware接口方法】invokeAwareMethods(beanName, bean);執(zhí)行xxxAware接口的方法
BeanNameAware\BeanClassLoaderAware\BeanFactoryAware
d-2)1698行:【執(zhí)行后置處理器初始化之前】applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
BeanPostProcessor.postProcessBeforeInitialization();
d-3)1702行:【執(zhí)行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd);
1)是否是InitializingBean接口的實現(xiàn);執(zhí)行接口規(guī)定的初始化;
2)是否自定義初始化方法;
d-4)1710行:【執(zhí)行后置處理器初始化之后】applyBeanPostProcessorsAfterInitialization
BeanPostProcessor.postProcessAfterInitialization();
3-2-7-5)將創(chuàng)建的Bean添加到緩存中singletonObjects;sharedInstance = getSingleton(beanName, ()跟進去
254行:addSingleton(),放到MAP中
ioc容器就是這些Map;很多的Map里面保存了單實例Bean,環(huán)境信息。。。。;
4)所有Bean都利用getBean創(chuàng)建完成以后;
檢查所有的Bean是否是SmartInitializingSingleton接口的;如果是;就執(zhí)行afterSingletonsInstantiated();
2.12 finishRefresh()
完成BeanFactory的初始化創(chuàng)建工作,IOC容器就創(chuàng)建完成
1)882行:initLifecycleProcessor();初始化和生命周期有關的后置處理器;LifecycleProcessor
默認從容器中找是否有l(wèi)ifecycleProcessor的組件【LifecycleProcessor】;如果沒有就new DefaultLifecycleProcessor(),加入到容器;
自己也可以嘗試寫一個LifecycleProcessor的實現(xiàn)類,可以在BeanFactory
?void onRefresh();
?void onClose();
2)885行:getLifecycleProcessor().onRefresh();
?拿到前面定義的生命周期處理器(BeanFactory);回調(diào)onRefresh();
3)888行:publishEvent(new ContextRefreshedEvent(this));發(fā)布容器刷新完成事件;
4)891行:liveBeansView.registerApplicationContext(this);
3.IOC容器流程總結
1.Spring容器在啟動的時候,先會保存所有注冊進來的Bean的定義信息
1)xml注冊bean;<bean>
2)注解注冊Bean;@Service、@Component、@Bean、xxx2.Spring容器會合適的時機創(chuàng)建這些Bean
1)用到這個bean的時候;利用getBean創(chuàng)建bean;創(chuàng)建好以后保存在容器中;
2)統(tǒng)一創(chuàng)建剩下所有的bean的時候;finishBeanFactoryInitialization();3.后置處理器——BeanPostProcessor
1)每一個bean創(chuàng)建完成,都會使用各種后置處理器進行處理;來增強bean的功能;
AutowiredAnnotationBeanPostProcessor:處理自動注入
AnnotationAwareAspectJAutoProxyCreator:來做AOP功能;
......
增強的功能注解:
AsyncAnnotationBeanPostProcessor
......4.事件驅(qū)動模型
ApplicationListener;事件監(jiān)聽;
ApplicationEventMulticaster;事件派發(fā):
參考
- 1)享學課堂James老師筆記