Spring原始碼分析之IOC(五)
前面已經分析ObtainFreshBeanfactory()這個方法是解析和註冊bean,例項化IOC容器的。
重新看一下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();
}
}
}
接著看prepareBeanFactory()。正如它的API文件上註明的那樣,就是配置beanFactory的context的特性包括有context的類載入器,和bean的後置處理器(BeanPostProcessor)。
postProcessBeanFactory():經過標準初始化,修改這個ApplicationContext的內部beanfactory。所有的bean都會被載入(load),但是還沒有經過例項化(Initialized)。主要是新增一些自定義的屬性,註冊BeanPostProcessor。
invokeBeanFactoryPostProcessors():例項化和呼叫所有註冊的BeanFactoryPostProcessor,API文件中標註了必須在 singleton bean的例項化之前呼叫。BeanFactoryPostProcessor和BeanPostProcessor的區別在於:BeanPostProcessor是在bean 例項化前後增加擴充套件點,對bean進行一些自定義的邏輯處理。而BeanFactoryPostProcessor從名字上就可以看出這是個Bean的Factory,所以是在Bean例項化之前進行的操作,例如獲取bean的定義資訊,修改bean的定義資訊。而且BeanFactoryPostProcessor可以定義多個,通過新增”order” 這個屬性來定義BeanFactoryPostProcessor的執行順序。舉個例子:在處理bean的時候,BeanFactoryPostProcessor修改Bean 的Definitions,然後bean例項化的時候,BeanPostProcessor在例項化前後新增擴充套件。(注:在設計模式中有個設計原則就是應該對擴充套件開放,對修改關閉的原則。認為BeanPostProcessor這個恰恰體現了這個原則,BeanPostProcessor中只有兩個方法一個postProcessBeforeInitialization是在例項化之前操作邏輯,postProcessAfterInitialization則是在例項化之後操作邏輯,而對中間的例項化不做修改)
registerBeanPostProcessors():例項化和呼叫所有註冊了BeanPostProcessor的Bean,API文件中同樣標註了必須在例項化Application beans之前呼叫。
initMessageSource():例項化訊息源工具類
initApplicationEventMulticaster():初始化Spring的事件廣播器,下面registerListeners()註冊了監聽器。事件廣播器負責將事件通知給所有的事件監聽器。
onRefresh():註冊一些特殊的Bean,預設情況下是為空的。
registerListeners():註冊所有的監聽器,接收initApplicationEventMulticaster廣播器通知的事件。
此篇博文到這裡就結束了。將在下篇仔細分析下Bean的例項化過程finishBeanFactoryInitialization()。