1. prepareRefresh() 刷新前的預處理
- initPropertySources() 初始化一些屬性設置;子類自定義個性化的屬性設置方法
- getEnvironment().validateRequiredProperties(); 檢驗屬性的合法等
- earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>(); 保存容器的一些早期事件
2. obtainFreshBeanFactory(); 獲取BeanFactory
- refreshBeanFactory(); 刷新BeanFactory
- 創建一個this.beanFactory = new DefaultListableBeanFactory();
- 給beanFactory設置ID
- getBeanFactory(); 返回剛剛GenericApplicationContext創建的beanFactory對象
- 將創建的DefaultListableBeanFactory返回
3. prepareBeanFactory(beanFactory); beanFactory的預處理準備工作(一般都是一些設置)
- 設置BeanFactory的類加載器 支持表達式解析器。。
- 添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
- 設置忽略的自動裝配的接口 EnvironmentAware EmbeddedValueResolverAware ResourceLoaderAware 不能通過自動注入
- 註冊可以解析的自動裝配; 我們可以在任何組件中使用自動注入 BeanFactory ResourceLoader ApplicationContext ApplicationEventPublisher
- 添加部分BeanPostProcessor【ApplicationListenerDetector】
- 添加編譯時的AspectJ支持
- 給BeanFactory中註冊一些能用的組件; environment【ConfigurableEnvironment】 systemProperties【Map】 systemEnvironment【Map】
4. postProcessBeanFactory(beanFactory); BeanFactory準備工作完成後進行的後置處理工作
- 子類通過重寫這個方法來在beanFactory創建並準備工作完成以後做進一步的設置
以上是BeanFactory的創建及預準備工作
5. invokeBeanFactoryPostProcessors(beanFactory); BeanFactory的後置處理器,在BeanFactory標準初始化之後BeanFactoryPostProcessor
- BeanFactoryPostProcessor
- BeanDefinitionRegistryPostProcessor
- 先執行BeanDefinitionRegistryPostProcessor的方法
- 獲取所有的BeanDefinitionRegistryPostProcessor
- 看先執行實現了PriorityOrdered優先級接口的BeanDefinitionRegistryPostProcessor
postProcess.postProcessBeanDefinitionRegistry(registry);
- 再執行實現了Ordered順序接口的BeanDefinitionRegistryPostProcessor
postProcess.postProcessBeanDefinitionRegistry(registry);
- 最後執行沒有實現任何優先級或者順序接口的BeanDefinitionRegistryPostProcessor
postProcess.postProcessBeanDefinitionRegistry(registry);
- 再執行BeanFactoryPostProcessor的方法
- 獲取所有的BeanFactoryPostProcessor
- 看先執行實現了PriorityOrdered優先級接口的BeanFactoryPostProcessor
postProcessor.postProcessBeanFactory(beanFactory);
- 再執行實現了Ordered順序接口的BeanFactoryPostProcessor
postProcessor.postProcessBeanFactory(beanFactory);
- 最後執行沒有實現任何優先級或者順序接口的BeanFactoryPostProcessor
postProcessor.postProcessBeanFactory(beanFactory);
6. registerBeanPostProcessors(beanFactory); 註冊BeanPostProcessor(Bean的後置處理器)【intercept bean creation.】
- BeanPostProcessor 不同類型的beanPostProcessor在創建bean後的執行時機是不一樣的
- DestructionAwareBeanPostProcessor
- InstantiationAwareBeanPostProcessor
- SmartInstantiationAwareBeanPostProcessor
- MergedBeanDefinitionPostProcessor 【放入internalPostProcessors】
- 獲取所有的BeanPostProcessor; 後置處理器默認都可以通過PriorityOrdered,Ordered指定優先級
- 先註冊PriorityOrdered優先級接口的BeanPostProcessor(把每個BeanPostProcessor添加到BeanFactory中)
beanFactory.addBeanPostProcessor(beanPostProcessor);
- 再註冊Ordered接口的
- 註冊沒有實現任何接口的
- 最後註冊MergedBeanDefinitionPostProcessor
- 註冊一個ApplicationListenerDetector, 來在bean創建完成檢查是否是ApplicationListener。如果是addApplicationListener
applicationContext.addApplicationListener((ApplicationListener<?>) bean);
7. initMessageSource(); 初始化MessageSource組件
- 做國際化功能
- 消息綁定
- 消息解析
- 獲取beanFactory
- 看容器中是否有id爲messageSource的組件。 如果有賦值給this.messageSource,沒有創建一個DelegatingMessageSource
- 把創建好的MessageSource註冊到容器中
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
8. initApplicationEventMulticaster(); 初始化事件派發器
- 獲取beanFactory
- 從beanFactory中獲取applicationEventMulticaster
- 如果上一步沒配置;創建一個SimpleApplicationEventMulticaster
9. onRefresh(); 留給子容器(子類)
- 子類重寫這個方法,在容器刷新的時候可以自定義邏輯 比如: springboot整合tomcat
10. registerListeners(); 給容器中所有的項目裏面的ApplicationListener註冊進來;
- 從容器中拿到所有的ApplicationListener
- 將每個監聽器添加到事件派發器中
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
- 如果存在earlyApplicationEvents 派發之前步驟產生的事件
getApplicationEventMulticaster().multicastEvent(earlyEvent);
11. finishBeanFactoryInitialization(beanFactory); 初始化所以剩下的單實例bean
- beanFactory.preInstantiateSingletons(); 初始化所以剩下的單實例bean
- 獲取容器中的所有beanName,依次進行初始化和創建對象
- 獲取bean的定義信息RootBeanDefinition
- bean不是抽象的,是單實例的,不是懶加載的
-
判斷是不是FactoryBean,是否實現FactoryBean
-
不是工廠bean, 通過getBean(beanName)創建對象
- DefaultListableBeanFactory getBean(beanName);IOC.getBean()
- 調父類AbstractBeanFactory doGetBean(name, null, null, false);
- 先獲取單例池中保存的單實例bean,如果能獲取到說明這個bean之前被創建過
- 緩存中獲取不到,開始創建流程
- 標記當前bean已經被創建 markBeanAsCreated(beanName);
- 獲取當前bean的定義信息
- 獲取當前bean依賴的其他bean;如果有按照getBean()把依賴的Bean先創建出來
- 啓動單實例bean的創建:
if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, () -> { return createBean(beanName, mbd, args);
1. AbstractAutowireCapableBeanFactory createBean(beanName, mbd, args); 2. Object bean = resolveBeforeInstantiation(beanName, mbdToUse); 讓BeanPostProcessor先攔截創建代理對象 執行【InstantiationAwareBeanPostProcessor】; 解析配置類會有使用 先觸發 postProcessBeforeInstantiation(beanClass, beanName); 後執行 postProcessAfterInitialization(result, beanName); 3. 如果前面的InstantiationAwareBeanPostProcessor沒有返回代理對象 調用4; 4. Object beanInstance = doCreateBean(beanName, mbdToUse, args); 1. 【創建bean實例】 createBeanInstance(beanName, mbd, args); 利用工廠方法或者構造器創建出對象 2. applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); 調用MergedBeanDefinitionPostProcessors bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName); 3. 提前暴露一個對象 4. 添加一個緩存 addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); 5. 【給bean屬性賦值】 populateBean(beanName, mbd, instanceWrapper); 1. 拿到 InstantiationAwareBeanPostProcessor後置處理器 postProcessAfterInstantiation(bw.getWrappedInstance(), beanName) 2. 拿到 InstantiationAwareBeanPostProcessor後置處理器 postProcessProperties(pvs, bw.getWrappedInstance(), beanName); 3. 應用bean屬性的值; 爲屬性利用setter方法進行賦值 applyPropertyValues(beanName, mbd, bw, pvs); 6. 【bean初始化】initializeBean(beanName, exposedObject, mbd); 1. 【執行Aware接口方法】invokeAwareMethods(beanName, bean); 執行 xxxAwarexx方法 BeanNameAware EnvironmentAware ImportAware BeanFactoryAware etc 2. 【執行後置處理器初始化之前】applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); @PostConstruct BeanPostProcessor.postProcessBeforeInitialization(result, beanName); 3. 【執行】 invokeInitMethods(beanName, wrappedBean, mbd); 1. 是否是InitializingBean接口的實現; 執行接口規定的初始化方法 ((InitializingBean) bean).afterPropertiesSet(); 2. 是否自定義初始化方法; xml 中配置 init-method的 invokeCustomInitMethod(beanName, bean, mbd); 4. 【執行後置處理器初始化之後】 applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); BeanPostProcessor.postProcessAfterInitialization(result, beanName); 7. registerDisposableBeanIfNecessary(beanName, bean, mbd); 註冊bean的銷燬方法 實現 DisposableBean接口的destroy() 5. 將創建的bean添加的到緩存中 sharedInstance = getSingleton(beanName, () -> {}) protected void addSingleton(String beanName, Object singletonObject) { synchronized (this.singletonObjects) { this.singletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); this.earlySingletonObjects.remove(beanName); this.registeredSingletons.add(beanName); } }
- 所有的bean都使用getBean創建完成以後 檢查所有的bean是SmartInitializingSingleton接口的 @EventListener 如果是執行 afterSingletonsInstantiated();
-
12. finishRefresh(); 完成bean的初始化創建工作, IOC容器就創建完成
- initLifecycleProcessor(); 初始化和生命週期有關的後置處理器; LifecycleProcessor 默認在容器中找是否有LifecycleProcessor類型的組件,沒有創建默認的DefaultLifecycleProcessor。創建完成會加入的容器中 寫一個LifecycleProcessor實現類,可以在BeanFactory刷新完成,關閉的時候調用 void onRefresh(); void onClose();
- getLifecycleProcessor().onRefresh(); 拿到前面生命週期處理器(監聽BeanFactory),回調onRefresh()
- publishEvent(new ContextRefreshedEvent(this)); 發佈容器刷新完成事件
- LiveBeansView.registerApplicationContext(this); Participate in LiveBeansView MBean, if active.
總結
- Spring容器在啓動的時候,先回保存所以註冊進來的Bean的定義信息
- xml 註冊bean; <bean>
- 註解註冊bean 例如 @Component,@Bean,@Service
- Spring容器會在何時的時機創建這些Bean
- 用到這個bean的時候,利用getBean創建bean,創建好以後保存在容器中
- 統一創建剩下所有的bean的時候,finishBeanFactoryInitialization(beanFactory)
- 後置處理器: 每個bean創建完成,都會使用各種後置處理器進行處理來增強Bean的功能
- AutowiredAnnotationBeanPostProcessor: 處理自動注入
- AnnotationAwareAspectJAutoProxyCreator: AOP代理功能
- 事件驅動
- ApplicationListener: 事件監聽
- ApplicationEventMulticaster:事件派發器