天天看點

Spring 源碼(十一)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 源碼(十一)Spring流程彙總

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 源碼(十一)Spring流程彙總

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 源碼(十一)Spring流程彙總

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 源碼(十一)Spring流程彙總

Spring Bean的自動裝配過程:

  1. 根據​

    ​Class​

    ​​對象,通過反射擷取所有的​

    ​Field​

    ​​和​

    ​Method​

    ​資訊
  2. 通反射擷取​

    ​Field​

    ​​和​

    ​Method​

    ​的注解資訊,并根據注解類型,判斷是否需要自動裝配
  3. 将需要自動裝配的元素,封裝成​

    ​AutowiredFieldElement​

    ​​或​

    ​AutowiredMethodElement​

    ​對象
  4. 調用​

    ​AutowiredFieldElement​

    ​​或​

    ​AutowiredMethodElement​

    ​​的​

    ​inject​

    ​方法,喚起後續步驟
  5. 通過調用容器的​

    ​getBean()​

    ​方法找到需要注入的源資料Bean
  6. 通過反射将找到的源資料Bean注入到目标Bean中

Spring Aware的自動裝配

  1. 判斷是否實作了​

    ​Aware​

    ​接口
  2. 判斷具體實作了那個​

    ​Aware​

    ​接口
  3. 直接調用​

    ​XxxAware​

    ​​接口的特有方法實作​

    ​XxxAware​

    ​的自動裝配

Spring MVC 流程圖

  1. 用戶端使用者發送請求至前端控制器DispatcherServlet。
  2. DispatcherServlet收到請求調用HandlerMapping處理器映射器。
  3. HandlerMapping處理器映射器找到具體的處理器(可以根據xml配置、注解進行查找),生成處理器對象及處理器攔截器(如果有則生成)一并傳回給DispatcherServlet。
  4. DispatcherServlet調用HandlerAdapter處理器擴充卡,HandlerAdapter經過适配調用具體的處理器(Controller,也叫後端控制器)。
  5. Controller控制器執行完成傳回ModelAndView,HandlerAdapter将controller執行結果ModelAndView傳回給DispatcherServlet。
  6. DispatcherServlet前端控制器将ModelAndView傳給ViewReslover視圖解析器。
  7. ViewReslover解析後傳回具體View。
  8. DispatcherServlet根據View進行渲染視圖(即将模型資料填充至視圖中),并傳回給用戶端使用者。

SpringMVC架構元件說明

  • DispatcherServlet:作為前端控制器,整個流程控制的中心,控制其它元件執行,統一排程,降低元件之間的耦合性,提高每個元件的擴充性。
  • HandlerMapping:通過擴充處理器映射器實作不同的映射方式,例如:配置檔案方式,實作接口方式,注解方式等。
  • HandlAdapter:通過擴充處理器擴充卡,支援更多類型的處理器。
  • ViewResolver:通過擴充視圖解析器,支援更多類型的視圖解析,例如:jsp、freemarker、pdf、excel等。