提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- debug spring流程概述
- refresh()方法
- 步骤
- 1.prepareRefresh()
- 2.obtainFreshBeanFactory();
- **==加载bean的定义信息==** ![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210505180822832.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODA1MjE2MQ==,size_16,color_FFFFFF,t_70)
- 3.prepareBeanFactory
- 4.postProcessBeanFactory
- 5.invokeBeanFactoryPostProcessors
- 6.registerBeanPostProcessors
- 7.initMessageSource
- 8.initApplicationEventMulticaster
- 9.onRefresh
- 10.registerListeners
- 11.==finishBeanFactoryInitialization==
- 12. finishRefresh
- 总结
debug spring流程概述
1.启动类:ClassPathXmlApplicationContext
2.ClassPathXmlApplicationContext
构造方法
调用父类构造方法,进行相关的对象创建等操作,包含属性的赋值操作
进入refresh()
refresh()方法
重要的refresh中的12个方法
步骤
- prepareRefresh
- obtainFreshBeanFactory
- prepareBeanFactory
- postProcessBeanFactory
- invokeBeanFactoryPostProcessors
- registerBeanPostProcessors
- initMessageSource
- initApplicationEventMulticaster
- onRefresh
- registerListeners
- finishBeanFactoryInitialization
- finishRefresh
步骤2-6是创建并准备beanFactory对象
步骤7-12是完善applicationContext的其他功能
步骤11是创建非懒加载的单例对象
1.prepareRefresh()
前置准备,做容器刷新前的准备工作
- 设置容器的启动时间
- 设置活跃状态为true
- 设置关闭状态为false
- 获取Environment对象,并加载当前系统的属性值到Environment对象中
- 准备监听器和事件的集合对象,默认为空的集合
2.obtainFreshBeanFactory();
- 创建容器对象:DefaultListableBeanFactory
- 加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition
createBeanFactory----创建bean工厂
new 一个 DefaultListableBeanFactory
DefaultListableBeanFactory
为了序列化指定id,可以从id反序列化到beanFactory对象
定制beanFactory,设置相关属性,包括是否允许覆盖同名称的不同定义的对象以及循环依赖
loadBeanDefinitions–加载bean的定义信息
加载bean的定义信息
beandefinitionMap
一路返回到 3.AbstractApplicationContext
3.prepareBeanFactory
beanFactory的准备工作,对各种属性进行填充
4.postProcessBeanFactory
留给子类做扩展用的方法
5.invokeBeanFactoryPostProcessors
调用各种beanFactory处理器
执行BeanFactoryPostProcessor 执行器
6.registerBeanPostProcessors
注册bean处理器,这里只是注册功能,真正调用的是getBean方法
实例化并且注册所有的beanPostProcessor
7.initMessageSource
为上下文初始化message源,即不同语言的消息体,国际化处理
8.initApplicationEventMulticaster
初始化事件监听多路广播器
9.onRefresh
留给子类来初始化其他的bean
10.registerListeners
遍历应用程序中存在的监听器集合,并将对应的监听器添加到监听器的多路广播器中
观察者模式–Observer
11.finishBeanFactoryInitialization
初始化剩下的单实例(非懒加载的)
12. finishRefresh
- 完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,
- 同时发出ContextRefreshEvent通知别人
总结
- prepareRefresh:准备好环境变量,配置变量
- obtainFreshBeanFactory:创建或获取bean工厂,并加载BeanDefinition
- prepareBeanFactory:beanFactory的准备工作,对各种属性进行填充
- postProcessBeanFactory:留给子类子类去扩展bean工厂
- invokeBeanFactoryPostProcessors:自定义beanFactory后置处理器去扩展bean工厂
- registerBeanPostProcessors:注册bean后置处理器
- initMessageSource:为spring容器提供国际化功能
- initApplicationEventMulticaster:为spring容器提供事件发布器
- onRefresh:留给子类对spring容器进行扩展
- registerListeners:为spring容器注册监听器
- finishBeanFactoryInitialization:初始化剩余的非懒加载单例bean,执行bean后置处理器扩展
- finishRefresh:准备spring容器生命周期管理器,发布contextRefreshed事件