Spring源码--02--Spring流程概述---refresh的12个步骤

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • debug spring流程概述
    • 1.启动类:ClassPathXmlApplicationContext
    • 2.ClassPathXmlApplicationContext
        • 调用父类构造方法,进行相关的对象创建等操作,包含属性的赋值操作
  • refresh()方法
        • 重要的refresh中的12个方法
    • 步骤
    • 1.prepareRefresh()
    • 2.obtainFreshBeanFactory();
      • createBeanFactory----创建bean工厂
      • **==new 一个 DefaultListableBeanFactory==** ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210505175837575.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODA1MjE2MQ==,size_16,color_FFFFFF,t_70)
      • loadBeanDefinitions--加载bean的定义信息
    • **==加载bean的定义信息==** ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210505180822832.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODA1MjE2MQ==,size_16,color_FFFFFF,t_70)
    • 3.prepareBeanFactory
    • 4.postProcessBeanFactory
        • 留给子类做扩展用的方法
    • 5.invokeBeanFactoryPostProcessors
      • 执行==BeanFactoryPostProcessor== 执行器
    • 6.registerBeanPostProcessors
    • 7.initMessageSource
    • 8.initApplicationEventMulticaster
    • 9.onRefresh
    • 10.registerListeners
        • 观察者模式--Observer
    • 11.==finishBeanFactoryInitialization==
    • 12. finishRefresh
  • 总结


debug spring流程概述


Spring源码--02--Spring流程概述---refresh的12个步骤_第1张图片

1.启动类:ClassPathXmlApplicationContext

Spring源码--02--Spring流程概述---refresh的12个步骤_第2张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第3张图片

2.ClassPathXmlApplicationContext

构造方法
Spring源码--02--Spring流程概述---refresh的12个步骤_第4张图片

调用父类构造方法,进行相关的对象创建等操作,包含属性的赋值操作

Spring源码--02--Spring流程概述---refresh的12个步骤_第5张图片

Spring源码--02--Spring流程概述---refresh的12个步骤_第6张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第7张图片

进入refresh()
Spring源码--02--Spring流程概述---refresh的12个步骤_第8张图片

refresh()方法

重要的refresh中的12个方法

Spring源码--02--Spring流程概述---refresh的12个步骤_第9张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第10张图片

步骤

  1. prepareRefresh
  2. obtainFreshBeanFactory
  3. prepareBeanFactory
  4. postProcessBeanFactory
  5. invokeBeanFactoryPostProcessors
  6. registerBeanPostProcessors
  7. initMessageSource
  8. initApplicationEventMulticaster
  9. onRefresh
  10. registerListeners
  11. finishBeanFactoryInitialization
  12. finishRefresh
    步骤2-6是创建并准备beanFactory对象
    步骤7-12是完善applicationContext的其他功能
    步骤11是创建非懒加载的单例对象

1.prepareRefresh()

Spring源码--02--Spring流程概述---refresh的12个步骤_第11张图片

前置准备,做容器刷新前的准备工作

  1. 设置容器的启动时间
  2. 设置活跃状态为true
  3. 设置关闭状态为false
  4. 获取Environment对象,并加载当前系统的属性值到Environment对象中
  5. 准备监听器和事件的集合对象,默认为空的集合
    Spring源码--02--Spring流程概述---refresh的12个步骤_第12张图片
    Spring源码--02--Spring流程概述---refresh的12个步骤_第13张图片
    Spring源码--02--Spring流程概述---refresh的12个步骤_第14张图片

2.obtainFreshBeanFactory();

Spring源码--02--Spring流程概述---refresh的12个步骤_第15张图片

  1. 创建容器对象:DefaultListableBeanFactory
  2. 加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition

Spring源码--02--Spring流程概述---refresh的12个步骤_第16张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第17张图片

createBeanFactory----创建bean工厂

Spring源码--02--Spring流程概述---refresh的12个步骤_第18张图片

new 一个 DefaultListableBeanFactory Spring源码--02--Spring流程概述---refresh的12个步骤_第19张图片

DefaultListableBeanFactory
Spring源码--02--Spring流程概述---refresh的12个步骤_第20张图片

为了序列化指定id,可以从id反序列化到beanFactory对象
Spring源码--02--Spring流程概述---refresh的12个步骤_第21张图片
定制beanFactory,设置相关属性,包括是否允许覆盖同名称的不同定义的对象以及循环依赖
Spring源码--02--Spring流程概述---refresh的12个步骤_第22张图片

loadBeanDefinitions–加载bean的定义信息

Spring源码--02--Spring流程概述---refresh的12个步骤_第23张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第24张图片

加载bean的定义信息 Spring源码--02--Spring流程概述---refresh的12个步骤_第25张图片

beandefinitionMap Spring源码--02--Spring流程概述---refresh的12个步骤_第26张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第27张图片

一路返回到 3.AbstractApplicationContext
Spring源码--02--Spring流程概述---refresh的12个步骤_第28张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第29张图片

3.prepareBeanFactory

beanFactory的准备工作,对各种属性进行填充
Spring源码--02--Spring流程概述---refresh的12个步骤_第30张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第31张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第32张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第33张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第34张图片

4.postProcessBeanFactory

Spring源码--02--Spring流程概述---refresh的12个步骤_第35张图片

留给子类做扩展用的方法

Spring源码--02--Spring流程概述---refresh的12个步骤_第36张图片

5.invokeBeanFactoryPostProcessors

调用各种beanFactory处理器
Spring源码--02--Spring流程概述---refresh的12个步骤_第37张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第38张图片

Spring源码--02--Spring流程概述---refresh的12个步骤_第39张图片

执行BeanFactoryPostProcessor 执行器

Spring源码--02--Spring流程概述---refresh的12个步骤_第40张图片

Spring源码--02--Spring流程概述---refresh的12个步骤_第41张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第42张图片

6.registerBeanPostProcessors

注册bean处理器,这里只是注册功能,真正调用的是getBean方法
Spring源码--02--Spring流程概述---refresh的12个步骤_第43张图片
实例化并且注册所有的beanPostProcessor
Spring源码--02--Spring流程概述---refresh的12个步骤_第44张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第45张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第46张图片

7.initMessageSource

为上下文初始化message源,即不同语言的消息体,国际化处理
Spring源码--02--Spring流程概述---refresh的12个步骤_第47张图片
在这里插入图片描述
Spring源码--02--Spring流程概述---refresh的12个步骤_第48张图片

8.initApplicationEventMulticaster

初始化事件监听多路广播器

Spring源码--02--Spring流程概述---refresh的12个步骤_第49张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第50张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第51张图片

9.onRefresh

留给子类来初始化其他的bean
Spring源码--02--Spring流程概述---refresh的12个步骤_第52张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第53张图片

10.registerListeners

遍历应用程序中存在的监听器集合,并将对应的监听器添加到监听器的多路广播器中
Spring源码--02--Spring流程概述---refresh的12个步骤_第54张图片

观察者模式–Observer

Spring源码--02--Spring流程概述---refresh的12个步骤_第55张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第56张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第57张图片

11.finishBeanFactoryInitialization

初始化剩下的单实例(非懒加载的)

Spring源码--02--Spring流程概述---refresh的12个步骤_第58张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第59张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第60张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第61张图片

12. finishRefresh

  • 完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,
  • 同时发出ContextRefreshEvent通知别人

Spring源码--02--Spring流程概述---refresh的12个步骤_第62张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第63张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第64张图片
Spring源码--02--Spring流程概述---refresh的12个步骤_第65张图片

总结

  1. prepareRefresh:准备好环境变量,配置变量
  2. obtainFreshBeanFactory:创建或获取bean工厂,并加载BeanDefinition
  3. prepareBeanFactory:beanFactory的准备工作,对各种属性进行填充
  4. postProcessBeanFactory:留给子类子类去扩展bean工厂
  5. invokeBeanFactoryPostProcessors:自定义beanFactory后置处理器去扩展bean工厂
  6. registerBeanPostProcessors:注册bean后置处理器
  7. initMessageSource:为spring容器提供国际化功能
  8. initApplicationEventMulticaster:为spring容器提供事件发布器
  9. onRefresh:留给子类对spring容器进行扩展
  10. registerListeners:为spring容器注册监听器
  11. finishBeanFactoryInitialization:初始化剩余的非懒加载单例bean,执行bean后置处理器扩展
  12. finishRefresh:准备spring容器生命周期管理器,发布contextRefreshed事件

Spring源码--02--Spring流程概述---refresh的12个步骤_第66张图片

你可能感兴趣的:(源码,spring,java,后端)