一、IOC 核心接口緩存
IOC 中最主要的有兩個接口,一個是BeanFactory ,一個是ApplicationContext 。app
BeanFactory 做爲IOC容器的頂層接口,提供了對容器bean 的一些基礎操做如getBean(xxx),containsBean(xxx),isSingleton(String name),getType(String name)。ide
ApplicationContext 繼承自BeanFactory接口,除了包含BeanFactory的全部功能以外,在國際化支持、資源訪問(如URL和文件)、事件傳播等方面進行了良好的支持。post
二、IOC 核心流程this
AbstractApplicationContext.refresh()spa
@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); /* * 一、刷新子類BeanFactory * 二、建立Beanfactory實例 * beanFactory = new DefaultListableBeanFactory() */ ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); /** 初始化 BeanFactory相關的一些配置 **/ prepareBeanFactory(beanFactory); try { //bean 工廠後置處理器 ,子類重寫 postProcessBeanFactory(beanFactory); /** 調用實現BeanFactoryProcessor接口的Bean的 beanFactoryPostProcessor方法 **/ invokeBeanFactoryPostProcessors(beanFactory); /** 註冊Bean後置處理器,攔截Bean的建立 **/ registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); /** 初始化事件多播器 **/ initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); //將全部項目裏面的ApplicationListener註冊進容器 registerListeners(); // 初始化全部剩下的單實例bean /** 一、beanFactory.preInstantiateSingletons();初始化後剩下的單實例bean 1)、獲取容器中的全部Bean,依次進行初始化和建立對象 2)、獲取Bean的定義信息;RootBeanDefinition 3)、Bean不是抽象的,是單實例的,是懶加載; 1)、判斷是不是FactoryBean;是不是實現FactoryBean接口的Bean; 2)、不是工廠Bean。利用getBean(beanName);建立對象 0、getBean(beanName); ioc.getBean(); 一、doGetBean(name, null, null, false); 二、先獲取緩存中保存的單實例Bean。若是能獲取到說明這個Bean以前被建立過(全部建立過的單實例Bean都會被緩存起來) 從private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);獲取的 三、緩存中獲取不到,開始Bean的建立對象流程; 四、標記當前bean已經被建立 五、獲取Bean的定義信息; 六、【獲取當前Bean依賴的其餘Bean;若是有按照getBean()把依賴的Bean先建立出來;】 七、啓動單實例Bean的建立流程; 1)、createBean(beanName, mbd, args); 2)、Object bean = resolveBeforeInstantiation(beanName, mbdToUse);讓BeanPostProcessor先攔截返回代理對象; 【InstantiationAwareBeanPostProcessor】:提早執行; 先觸發:postProcessBeforeInstantiation(); 若是有返回值:觸發postProcessAfterInitialization(); 3)、若是前面的InstantiationAwareBeanPostProcessor沒有返回代理對象;調用4) 4)、Object beanInstance = doCreateBean(beanName, mbdToUse, args);建立Bean 1)、【建立Bean實例】;createBeanInstance(beanName, mbd, args); 利用工廠方法或者對象的構造器建立出Bean實例; 2)、applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); 調用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd, beanType, beanName); 3)、【Bean屬性賦值】populateBean(beanName, mbd, instanceWrapper); 賦值以前: 1)、拿到InstantiationAwareBeanPostProcessor後置處理器; postProcessAfterInstantiation(); 2)、拿到InstantiationAwareBeanPostProcessor後置處理器; postProcessPropertyValues(); =====賦值以前:=== 3)、應用Bean屬性的值;爲屬性利用setter方法等進行賦值; applyPropertyValues(beanName, mbd, bw, pvs); 4)、【Bean初始化】initializeBean(beanName, exposedObject, mbd); 1)、【執行Aware接口方法】invokeAwareMethods(beanName, bean);執行xxxAware接口的方法 BeanNameAware\BeanClassLoaderAware\BeanFactoryAware 2)、【執行後置處理器初始化以前】applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); BeanPostProcessor.postProcessBeforeInitialization(); 3)、【執行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd); 1)、是不是InitializingBean接口的實現;執行接口規定的初始化; 2)、是否自定義初始化方法; 4)、【執行後置處理器初始化以後】applyBeanPostProcessorsAfterInitialization BeanPostProcessor.postProcessAfterInitialization(); 5)、註冊Bean的銷燬方法; 5)、將建立的Bean添加到緩存中singletonObjects; ioc容器就是這些Map;不少的Map裏面保存了單實例Bean,環境信息。。。。; 全部Bean都利用getBean建立完成之後; 檢查全部的Bean是不是SmartInitializingSingleton接口的;若是是;就執行afterSingletonsInstantiated(); */ 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(); } } }
三、總結代理
1)、Spring容器在啓動的時候,先會保存全部註冊進來的Bean的定義信息;
1)、xml註冊bean;<bean>
2)、註解註冊Bean;@Service、@Component、@Bean、xxx
2)、Spring容器會合適的時機建立這些Bean
1)、用到這個bean的時候;利用getBean建立bean;建立好之後保存在容器中;
2)、統一建立剩下全部的bean的時候;finishBeanFactoryInitialization();
3)、後置處理器;BeanPostProcessor
1)、每個bean建立完成,都會使用各類後置處理器進行處理;來加強bean的功能;
AutowiredAnnotationBeanPostProcessor:處理自動注入
AnnotationAwareAspectJAutoProxyCreator:來作AOP功能;
xxx....
加強的功能註解:
AsyncAnnotationBeanPostProcessor
4)、事件驅動模型;
ApplicationListener;事件監聽;
ApplicationEventMulticaster;事件派發: