1. 程式人生 > >Spring原始碼分析之IOC(五)

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()。