Spring一个Bean的出生过程
(1)ResourceLoader从存储介质中加载Spring配置信息,并使用Resource表示这个配置文件资源。
(2)BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中的每个<bean>解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中。
(3)容器扫描BeanDefinitionRegistry中的BeanDefinition,使用Java反射机制自动识别出Bean工厂后期处理器(实现BeanFactoryPostProcessor接口的Bean),然后调用这些Bean工厂后处理器对BeanDefinitionRegistry中的BeanDefinition进行加工处理。主要完成以下两项工作:
a: 对使用占位符的<bean>元素标签进行解析,得到最终的配置值。这意味着对一些半成品式的BeanDefinition对象进行加工得到成品的BeanDefinition。
b: 对BeanDefinitionRegistry中的BeanDefinition进行扫描,通过Java反射机制找出所有属性编辑器的Bean(实现java.beans.PropertyEditor接口的Bean),并自动将它们注册到Spring容器的PropertyEditorRegistry中。
(4)Spring容器从BeanDefinitonRegistry中取出加工后的BeanDefinition,并调用InstanceStrategy着手进行Bean实例化的工作。
(5)在实例化Bean时,Spring容器使用BeanWrapper对Bean进行封装。BeanWrapper提供了很多以Java反射机制操作Bean的方法,它将结合该Bean的BeanDefinition及容器中的属性编辑器,完成Bean属性注入工作。
(6)利用容器中出册的Bean后处理器(实现beanPostProcessser接口的Bean)对已经完成属性设置工作的Bean进行后续加工,直接装配出一个准备就绪的Bean。