作者:mobiledu2502898543 | 来源:互联网 | 2023-10-16 09:43
1我们加载配置文件到BeanFactory容器中那么首先我们需要创建beanFactory容器 进入构造方法 super 调用父类构造方法 准备初始化资源对象setConfigL
1 我们加载配置文件 到 BeanFactory容器中
那么首先我们需要创建beanFactory容器
进入构造方法
super 调用父类构造方法 准备初始化资源对象
setConfigLocations 加载配置文件(文件路径)
refresh() 里面包含13个方法 spring核心方法
1 准备刷新 做容器刷新前准备工作(标志位和启动时间,初始化属性资源null,获取环境资源属性,存储预刷新容器的监听器null)
1.1设置标志位和启动时间
1.2 初始化属性资源 为了子类实现扩展 目前什么都没有实现(在springMVC时 会出现响应扩展操作)
1.3 获取环境资源属性 包含了系统属性值和变量值 并且验证属性资源
1.4 存储预刷新容器的监听器
---
2 获得一个刷新的beanFactory 容器(defaultListableBeanFactory) 加载xml配置文件的属性值到当前工厂中
具有继承关系的接口
beanFactory子接口 能够枚举所有bean实例
当前beanFactory 想要他可以参加配置 必须要实现对应的接口
告诉子类刷新beanFactory
如果有beanFactory 了 就先销毁掉 关闭掉beanFactory
创建一个新的beanFactory
而创建beanFactory 是 defaultListableBeanFactory
创建完工厂之后 设置序列化id 和 定制beanFactroy
定制话beanFactory 信息里面设置了 允许bean定义信息被覆盖 允许循环依赖
解析xml文件
这里的configLocations 在之前刚进入refresh之前 设置配置文件的路径
当执行这一步的时候 就可以将配置文件读取到beanFactory中
此时将xml文件中的标签解析成了map对象
----------
3 初始化beanFactory (因为上一步刚创建了beanFactory 里面很多都是默认值)
3.1 设置bean的类加载器
3.2 设置解析配置文件的 解析器 spel
3.3 添加资源加载器
3.4 添加beanPostProcessor 增强器
3.5 忽略这些Aware接口 不进行解析操作(因为此时还没有初始化完成 会在后面设置Aware接口做统一处理)
3.6 处理依赖
3.7 添加bean的增强器
-----------------
4 执行后置处理器的相关操作(null 方便扩展操作)
5 执行 BeanFactoryPostProcessors 实例化 并且 执行 所有注册过的 beanFactoryPostProcessor 单例对象在初始化之前必须被调用(beanFactory 容器对象) 实例化之后 在修改beanDefinition没有意义
6. 在当前bean创建之前我们需要 实例化并且注册 所有beanPostProcessor 实例 提前准备好beanPostProcessor 需要准备的东西
7 初始化消息资源 (国际化设置)
8 初始化应用程序事件的广播器
9 留给子类执行扩展工作
10 注册监听器
11 实例化所有的非懒加载单例对象(实例化操作)
11.1 将beanDefinitionNames中的 bean名称放入ArrayList中
11.2循环创建单例对象
11.2.1返回一个合并好的rootBeanDefinition 对象 遍历他们的父beanDefinition 也就是整合父类和子类的beanDefinition
11.2.2判断这个类是否实现了 beanFactory这个接口 因为我们创建的类并没有实现beanFactory这个接口
11.2.3那么执行
11.2.3.1 获取bean名称
11.2.3.2 每次创建对象之前 我们需要判断1.2.3级缓存是否包含此对象 如果包含 直接从缓存中取 如果不包含 再创建对象
先检查一级缓存是否存在person 对象
如果一级缓存没有 那么执行创建对象 因为此时shareInstance为null 所以 执行eles
创建bean实例
填充属性
bean实现了Aware接口的话 就会把属性填充进去 当前bean没有实现awre接口
执行BeanPostProcessorBeforeInitlization方法
执行init-method 方法
执行BeanPostProcessorAfterInitlization方法
返回完整对象
当容器关闭时 我们需要销毁该对象