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(); } } }
一、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就是在這裏實現的。