IOC
BeanFactory生命流程
- BeanFactory 加载Bean 配置文件 ,将读取到的Bean 配置封装成一个对象 BeanDefinition 对象
- 将封装好的对象 注册到 BeanDefinition 容器中
- 注册 BeanPostProcessor 相关实现类到 BeanPostProcessor 容器中
- BeanFactory 进入就绪状态
- 外部调用 BeanFactory 的 getBean(String name) 方法,BeanFactory 着手实例化相应的 bean
- 重复步骤 3 和 4,直至程序退出,BeanFactory 被销毁
BeanDefinition介绍
BeanDefinition 的作用就是储存xml中每一个bean中的信息,其中里面property 是被
PropertyValue 存储的 ref 是被 BeanReference存储的
XML 解析
BeanFactory 初始化的时候,会根据传入的xml 配置文件路径加载并解析配置文件,但是加载配置文件的过程是交给BeanDefinitionReader 的实现XmlBeanDefinitionReader 去做 XmlBeanDefinitionReader 做的是以下几件事:
- 将xml配置文件加载至内存
- 获取根标签下的所有 标签
- 遍历标签列表,并从标签读取id class 属性保存到BeanDefinition 对象中
- 遍历标签下 标签,从中读取属性值并保存到PropertyValue中
- 将<id,BeanDefinition> 键值对缓存在Map中,留作后用
- 重复3,4,5,6 步,直到解析结束
注册BeanPostProcessor
BeanPostProcessor 接口是spring对外拓展的接口之一,其主要用途提供一个机会,让开发人员能够插手bean的实例化过程。通过实现这个接口,我们就可以在bean实例化时,对bean进行一些处理,比如,,我们所熟悉的AOP就是在这里将切面逻辑织入相关bean 中的 正是因为有了BeanPostProcessor 接口作为桥梁才能够使得IOC和AOP产生联系。
XmlBeanDefinitionReader 在解析工作完成之后,BeanFaction会将他解析的<id,BeanDefinition> 键值对注册到自己的beanDefinitionMap中。BeanFactory 注册号beanDefinition 后就开始注册BeanPostProcessor 相关的实现类
- 根据BeanDefinition 记录的信息,寻找所有实现了BeanPostProcessor 接口的类
- 实例化BeanPostProcessor 接口的实现类
- 将实例好的对象放入到List 中
- 重复2,3步 直至将所有实现类完成注册
getBean过程解析
在完成xml的解析,BeanDefinition 的注册以及BeanPostProcessor 的注册过程后。BeanFactory的初始化工作基本结束 此时BeanFactory处于就绪状态,等待外部调用。外部程序一般都是通过BeanFactory 中的getBean(String name) 方法来获取容器中的bean BeanFactory 具有延迟初始化bean的特性 ,也就是等待外部程序调用的时候,才实例化相关的bean 这样做的好处是:
- 提高了BeanFactory的初始化速度
- 节省了内存资源
接下来就是Bean的实例化过程
- 实例化bean对象
- 设置对象属性
- 检查Aware 相关接口并设置相关依赖
- BeanPostProcessor前置处理
- 检查是否是 InitializingBean 以决定是否调用afterPropertiesSet方法
- 检查是否配置了自定义的init-method
- BeanPostProcessor后置处理
- 注册必要的Destruction 相关回调接口 、
- 使用中。。。
- 是否实现DisposableBean接口
- 是否配置了自定义destroy方法