Spring 容器从加载配置文件到创建出一个完整的Bean 的作业流程及参与的角色
(1),ResourceLoader 从存储介质中加载Spring配置信息,并使用Resource表示这个配置文件资源
(2),BeanDefinitionReader 读取 Resource 所指向的配置文件资源,然后结项配置文件。配置文件中的每个<Bean> 解析成一个 BeanDefinition 对象,并保存至 BeanDefinitionRegistry 中去
(3),容器扫描 BeanDefinitionRegistry 中的 BeanDefinition, 使用 Java 反射机制 识别出 Bean 后置处理器(实现BeanFactoryPostProcessor 接口的Bean),然后调用这些Bean工厂后处理器对BeanDefinitionRegistry 中的 BeanDefinition 进行加工处理,主要完成两项工作:
- 对使用占位符的<Bean> 元素标签进行解析工作,得到最终的配置值。这意味着对一些半成品的BeanDefinition 对象进行加工处理并得到成品的 BeanDefinition 对象
- 对 BeanDefinitionRegistry 中的BeanDefinition 进行扫描,通过 java 反射机制 找出所有属性编辑器Bean(所有实现了PropertyEditor 接口的Bean),并将它们自动注册到Spring 容器的属性编辑器注册表中(PropertyEditorRegistry)
(4),Spring 容器从BeanDefinitionRegistry 中取出加工后的BeanDefinition ,并调用 InstantiationStrategy 着手进行Bean 实例化的工作
(5),在实例化Bean 时,Spring 容器使用 BeanWrapper 对Bean 进行封装,完成Bean 属性的注入工作
(6),利用容器中注册的Bean 后处理器(实现 BeanPostProcessor 接口的Bean)对已经完成属性注入工作的 Bean 进行后续加工,直接装配出一个准备就绪的 Bean