1. 程式人生 > >Spring 原始碼(十一)Spring流程彙總

Spring 原始碼(十一)Spring流程彙總

Spring 容器初始化流程大致流程如下:

  1. this():註冊內建的BeanPostProcessor的BeanDefinition到容器
  2. register(annotatedClasses):註冊配置類 BeanDefinition 到容器
  3. prepareRefresh():初始化前的準備工作,列如對系統屬性或者環境變數進行驗證
  4. obtainFreshBeanFactory():初始化 BeanFactory
  5. prepareBeanFactory(beanFactory):對 BeanFactory 進行各種功能的填充,比如對錶達式的支援等
  6. postProcessBeanFactory(beanFactory):留給子類擴充套件用
  7. invokeBeanFactoryPostProcessors(beanFactory):執行BeanFactoryPostProcessor後置處理器
  8. registerBeanPostProcessors(beanFactory):建立並註冊所有的BeanPostProcessor後置處理
  9. initMessageSource():初始化訊息元件(國際化,訊息繫結,訊息解析)
  10. initApplicationEventMulticaster():初始化容器的事件機制
  11. onRefresh():初始化其他特殊Bean(留給子類做擴充套件用)
  12. registerListeners():註冊監聽器(ApplicationListener)
  13. finishBeanFactoryInitialization(beanFactory):建立並註冊所有的單例且非懶載入的Bean
  14. finishRefresh():完成重新整理過程,通知生命週期處理器 lifecycleProcessor 重新整理過程,同時發出 ContextRefreshEvent 通知別人。
  15. resetCommonCaches():重置快取

Spring Bean的生命週期

Spring Bean的生命週期:

  1. InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation():例項化Bean的前置處理
  2. createBeanInstance(beanName, mbd, args):例項化Bean
  3. MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition():合併Bean定義資訊(自動裝配元素)
  4. InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation():例項化Bean的後置處理
  5. InstantiationAwareBeanPostProcessor#postProcessPropertyValues():Bean的自動裝配
  6. 部分Aware介面的自動裝配:BeanNameAware#setBeanName()BeanClassLoaderAware#setBeanClassLoader()BeanFactoryAware#setBeanFactory()
  7. BeanPostProcessor#postProcessBeforeInitialization():Bean初始化的前置處理
  8. 剩餘部分Aware介面的自動裝配:EnvironmentAware#setEnvironment()EmbeddedValueResolverAware#setEmbeddedValueResolver()ResourceLoaderAware#setResourceLoader ()ApplicationEventPublisherAware#setApplicationEventPublisher ()MessageSourceAware#setMessageSource ()ApplicationContextAware# setApplicationContext ()
  9. @PostConstruct:執行初始化方法
  10. InitializingBean#afterPropertiesSet():執行初始化方法
  11. @Bean(initMethod = "initMethod"):執行初始化方法
  12. BeanPostProcessor#postProcessAfterInitialization():Bean初始化的後置處理
  13. DestructionAwareBeanPostProcessor#postProcessBeforeDestruction():銷燬Bean的後置處理(@PreDestroy)
  14. DisposableBean#destroy():執行銷燬方法
  15. @Bean(destroyMethod = "destroyMethod"):執行銷燬方法

Spring AOP執行流程

Spring AOP執行流程:

  1. @EnableAspectJAutoProxy開啟對AOP的支援,註冊後置處理器 AnnotationAwareAspectJAutoProxyCreator
  2. 根據Class物件找出所有切面類(有@Aspect註解的類)
  3. 解析切面類中的增強器(解析@Before等註解),並放入快取中
  4. 根據ProxyFactory工廠類建立AopProxy代理器
  5. 根據AopProxy代理器建立代理類
  6. 通過增強器執行入口執行增強器 JdkDynamicAopProxy#invoke()CglibAopProxy.DynamicAdvisedInterceptor#intercept()
  7. 獲取連結鏈 AdvisedSupport#getInterceptorsAndDynamicInterceptionAdvice()
  8. 以遞迴方式執行攔截鏈 ReflectiveMethodInvocation.proceed()

Spring 迴圈依賴:

Spring 迴圈依賴.png

Spring 迴圈依賴流程:

  1. !this.singletonsCurrentlyInCreation.remove(beanName):將當前正建立Bean的標示放到Set集合中,如果失敗則說明發生了迴圈建立,直接丟擲BeanCurrentlyInCreationException異常,防止死迴圈
  2. addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory):將完成例項化但是還未完成賦值的物件放到singletonFactories容器中,提前暴露出來
  3. getSingleton(String beanName, boolean allowEarlyReference):當有物件建立過程中需要當前正在建立中的物件的時候就需要從singletonFactories容器中獲取物件,這時我們可以通過後置處理器SmartInstantiationAwareBeanPostProcessor對獲取到的物件進特殊處理,然後放到earlySingletonObjects容器中
  4. 最後將建立完成的Bean放到singletonObject容器中

Spring Bean的自動裝配

Spring Bean的自動裝配過程:

  1. 根據Class物件,通過反射獲取所有的FieldMethod資訊
  2. 通反射獲取FieldMethod的註解資訊,並根據註解型別,判斷是否需要自動裝配
  3. 將需要自動裝配的元素,封裝成AutowiredFieldElementAutowiredMethodElement物件
  4. 呼叫AutowiredFieldElementAutowiredMethodElementinject方法,喚起後續步驟
  5. 通過呼叫容器的getBean()方法找到需要注入的源資料Bean
  6. 通過反射將找到的源資料Bean注入到目標Bean中

Spring Aware的自動裝配

  1. 判斷是否實現了Aware介面
  2. 判斷具體實現了那個Aware介面
  3. 直接呼叫XxxAware介面的特有方法實現XxxAware