spring ApplicationContext中Bean的生命週期

AbstractApplicationContextjava

Spring的AbstractApplicationContext是ApplicationContext的抽象實現類,該抽象類的refresh方法定義了spring容器在加載配置文件後的各項處理過程spring

   public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            prepareRefresh();
            // 初始化BeanFactory
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
            prepareBeanFactory(beanFactory);
            try {
                postProcessBeanFactory(beanFactory);
                /**
                 *  調用工廠後處理器:
                 *  根據反射機制找出全部實現了BeanFactoryPostProcessor接口的Bean,
                 *  並調用其postProcessBeanFactory()接口方法
                 */
                invokeBeanFactoryPostProcessors(beanFactory);
                /**
                 * 註冊Bean後處理器:
                 * 根據反射機制找出全部實現了BeanPostProcessor接口的Bean,
                 * 並註冊
                 */
                registerBeanPostProcessors(beanFactory);
                // 初始化消息源:初始化容器的國際化消息資源
                initMessageSource();
                // 初始化Application事件廣播器
                initApplicationEventMulticaster();
                // 初始化其餘特殊的Bean,由具體子類實現
                onRefresh();
                // 註冊事件監聽器
                registerListeners();
                // 初始化全部單例的Bean,使用懶加載的除外
                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();
            }
        }
    }
AbstractApplicationContext源碼

一、ResourceLoader加載配置信息,並使用Resource表示配置文件app

二、BeanDefinitionReader讀取Resource的配置文件,並解析配置文件——把配置文件中的每一個<bean>解析成一個BeanDefinition對象,並保存到BeanDefinitionRegistry中。編輯器

BeanDefinition接口有一個抽象類AbstractBeanDefinition,AbstractBeanDefinition有兩個實現類,ChildBeanDefinition和RootBeanDefinition。
在xml配置文件中,能夠定義父<bean>和了<bean>,父<bean>用RootBeanDefinition來表示,子<bean>用ChildBeanDefinition表示;沒有父<bean>的<bean>直接使用RootBeanDefinition表示;AbstractBeanDefinition對兩者共同的類信息進行抽象。ide

三、容器掃描全部的BeanDefinition,使用反射機制識別出Bean工廠後處理器——即實現了BeanFactoryPostProcessor接口的bean,並調用這些Bean工廠後處理器的postProcessBeanFactory方法對BeanDefinition進行加工處理,主要完成如下兩項任務:post

a.解析使用佔位符的<bean>元素,獲得配置值this

b.掃描全部的BeanDefinition,經過java反射機制找出全部屬性編輯器的bean——即實現了java.beans.PropertyEditor接口的bean,並將它們註冊到spring的屬性編輯器註冊表中。spa

四、調用InstantiationStrategy實例化beancode

這裏用到了策略模式:InstantiationStrategy接口有一個實現類SimpleInstantiationStrategy,SimpleInstantiationStrategy又有一個實現類CglibSubclassingInstantiationStrategy;SimpleInstantiationStrategy是最經常使用到的實例化策略;CglibSubclassingInstantiationStrategy利用CGLib爲bean動態生成子類,在子類中生成方法注入的邏輯以支持方法注入,而後使用這個動態生成的子類建立Bean的實例。xml

五、實例化bean後,容器主程序調用BeanWrapper的setWrapperInstance(Object obj)方法把實例化後的bean傳遞到BeanWrapper裏。

六、BeanWrapper結合BeanDefinition、屬性編輯器完成屬性注入

七、使用Bean後處理器——實現了BeanPostProcessor接口的bean,對bean進行後續加工——SpringAOP就是在這裏實現的。

相關文章
相關標籤/搜索